1. 程式人生 > >HDU(1106):排序

HDU(1106):排序

題目:

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 75113    Accepted Submission(s): 23029

Problem Description

輸入一行數字,如果我們把這行數字中的‘5’都看成空格,那麼就得到一行用空格分割的若干非負整數(可能有些整數以‘0’開頭,這些頭部的‘0’應該被忽略掉,除非這個整數就是由若干個‘0’組成的,這時這個整數就是0)。 你的任務是:對這些分割得到的整數,依從小到大的順序排序輸出。

Input

輸入包含多組測試用例,每組輸入資料只有一行數字(數字之間沒有空格),這行數字的長度不大於1000。   輸入資料保證:分割得到的非負整數不會大於100000000;輸入資料不可能全由‘5’組成。

Output

對於每個測試用例,輸出分割得到的整數排序的結果,相鄰的兩個整數之間用一個空格分開,每組輸出佔一行。

Sample Input

0051231232050775

Sample Output

0 77 12312320

題解:

       這個題的題意很好理解:輸入一數字字串,其中數字“5”作為“空格”分隔符,每一部分作為一個數,並進行排序。根據例題輸出中的資料就可以知道,若全是0構成的部分(000、0000等)都作為0處理,而“0775”則作為775處理。

       1、字串轉換為整數型陣列;

       2、存在連續是5的情況,則全部作為空格處理;

      3、sort函式排序;

程式碼:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char x[1005];
int y[1000];
char t[1000];
int z=0;
int f(int a){
    int sum=1;
    if(a==0)
        return 1;
    else{
        for(int i=1;i<=a;i++)
            sum*=10;
    }
    return sum;
}
int main()
{
    while(~scanf("%s",x)){
    int len=strlen(x);
    int sum=0;
    int a=0;
    for(int i=len-1;i>=0;i--){
        if(x[i]!='5'){
            sum+=(x[i]-'0')*f(a++);
            if(i==0)
               y[z++]=sum;
        }
        else{
            if(i==len-1)
               continue;
            if(x[i]=='5'&&x[i+1]=='5')
               continue;
            else{
            y[z++]=sum;
            sum=0;
            a=0;
            }
        }
    }
    sort(y,y+z);
    for(int i=0;i<z;i++){
        printf("%d",y[i]);
        if(i!=z-1)
            printf(" ");
        else
            printf("\n");
    }
    z=0;
    }
    return 0;
}