今天LZQ在玩一種小遊戲,但是這遊戲數有一點點的大,他一個人玩的累,想多拉一些人進來幫幫他,你能寫一個程式幫幫他嗎?這個遊戲是這樣的:有一行數字,如果我們把這行數字中的‘5’都看成空格,那麼就得到一行用空格分割的若干非負整數(可能有些整數以‘0’開頭,這些頭部的‘0’應該被忽略掉,除非這個整數就是由若干個‘0’組成的,這時這個整數就是0)。
你的任務是:對這些分割得到的整數,依從小到大的順序排序輸出,大家趕緊寫個程式來幫幫LZQ吧!
-
輸入
-
輸入包含多組測試案例,每組輸入資料只有一行數字(數字之間沒有空格),這行數位長度不大於5000。
輸入資料保證:分割得到的非負整數不會大於100000000;如果有輸入資料全為5,則輸出0。
-
輸出
-
對於每個測試案例,輸出分割得到的整數排序的結果,相鄰的兩個整數之間用一個空格分開,每組輸出佔一行。
-
範例輸入
-
0051231232050775
-
範例輸出
-
0 77 12312320
此題可用sscanf解決,再次溫習了sscanf的用法,同時又瞭解了strtok的用法,
AC代碼
#include<iostream>#include<stdio.h>#include<cstring>#include<string>#include<algorithm>using namespace std;char str[5005];int a[5005];int main(){ while(scanf("%s",str)!=EOF) { int j,i=0,len=strlen(str),k=0,num; for(i=0;i<len;++i) if(str[i]=='5') str[i]=' '; i=0; for(j=0;j<len;++j) if(str[j]!=' ') { sscanf(str+j,"%i%n",&a[k++],&num); //%表示為選擇 i為選擇條件,整型,n為選擇的個數,同時應該注意轉換的字元包括\0. j=j+num; } sort(a,a+k); if(k==0) printf("0\n"); for(int q=0;q<k;++q) printf("%d ",a[q]); printf("\n"); } //system("pause"); return 0;}
strtok的用法,摘自百度百科~
範例程式碼:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char sentence[]="This is a sentence!";
cout<<sentence<<endl;
char *ptr=strtok(sentence," ");
while(ptr!=NULL)
{
cout<<ptr<<endl;
ptr=strtok(NULL," ");
}
system("pause");
return 0;
}
函數第一次調用需設定兩個參數。第一次分割的結果,返回串中第一個 ',' 之前的字串,也就是上面的程式第一次輸出this。
第二次調用該函數strtok(NULL,","),第一個參數設定為NULL。結果返回分割依據後面的字串,即第二次輸出is。