今天LZQ在玩一种小游戏,但是这游戏数有一点点的大,他一个人玩的累,想多拉一些人进来帮帮他,你能写一个程序帮帮他吗?这个游戏是这样的:有一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出,大家赶紧写个程序来帮帮LZQ吧!
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出,大家赶紧写个程序来帮帮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。