杭電oj 1106題------排序
阿新 • • 發佈:2018-11-25
排序
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
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]); } } } }