1. 程式人生 > >杭電oj 1106題------排序

杭電oj 1106題------排序

排序

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


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

你的任務是:對這些分割得到的整數,依從小到大的順序排序輸出。

 
Input 輸入包含多組測試用例,每組輸入資料只有一行數字(數字之間沒有空格),這行數字的長度不大於1000。  

輸入資料保證:分割得到的非負整數不會大於100000000;輸入資料不可能全由‘5’組成。
 
Output 對於每個測試用例,輸出分割得到的整數排序的結果,相鄰的兩個整數之間用一個空格分開,每組輸出佔一行。
 
Sample Input
0051231232050775  
Sample Output

  
   0 77 12312320
  
 
 
   
 
 
Source POJ

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1106

大致思路:遇到‘5’就k++,遇到不是‘5’的就存到數組裡面,最後用sort排序。一些麻煩問題在程式碼中註解。。。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
    char a[2000];
    int b[2000];
    int i,len,k;
    while(scanf("%s",a)!=EOF)
    {
        k=0;
        memset(b,0,sizeof(b)); //用memset歸零b陣列.
        len=strlen(a);
        for(i=0;i<len;i++)
        {
            if(a[i]!='5')
                b[k]=b[k]*10+(a[i]-'0'); //遇見不是'5'的數就減去'0'得到這個數,這個公式把數組合起來。
            if(a[i]=='5'&&a[i+1]!='5')
                k++;                     //遇見是'5'而且下個數不是'5'的數 ,k++。 這裡是防止多個'5'。
            if(a[i]!='5'&&a[i+1]=='\0')
                k++;                     //處理'5'不在最後最後幾位不輸出的情況
        }
        sort(b,b+k); //sort排序。。
        if(a[0]!='5')           //這裡一個問題,假如a[0]=='5'的時候,比如5512513 上面第二個if條件會成立,就會多加一次k,使得b[0]='0',比如輸出0 12 13而不是12 13,所以這裡分情況輸出
        {
            for(i=0;i<k;i++)       //a[0]!='5',i從0輸出
            {
                if(i!=k-1)
                    printf("%d ",b[i]);
                else
                    printf("%d\n",b[i]);
            }
        }
        if(a[0]=='5')           //a[0]=='5',i從1輸出  避開b[0]='0'的情況
        {
            for(i=1;i<k;i++)
            {
                if(i!=k-1)
                    printf("%d ",b[i]);
                else
                    printf("%d\n",b[i]);
            }
        }
    }
}