应该算是模拟题,不过小case很多,正常模拟的话很难AC,wa了好多次,还是决定去看大神的代码。然后发现的大神并不是模拟的。。
而是用了两个函数:strtok和atoi。
原型:char *strtok(char s[], const char *delim);
分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。
还有一个将字符串数字转成整形数字的函数atoi(ascii to integer)
把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。 int atoi(const char *nptr) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束符(‘\0’)才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0。
建议自己尝试一下这两个函数的使用方法。
AC代码:
/* HDU 1106 排序 */
#include<bits/stdc++.h>
using namespace std;
char s[1200],*p;
int a[600],cnt; //最多是一个空格一个数字 500个
int main(void){
while(cin>>s){
cnt = 0;
p = strtok(s,"5");
while(p!=NULL){ //去除前导5
a[cnt++] = atoi(p);
p = strtok(NULL,"5");
}
sort(a,a+cnt);
//一直以为不能输出重复的,结果。。没要求
cout<<a[0];
for(int i=1;i<cnt;i++)
cout<<' '<<a[i];
cout<<endl;
}
return 0;
}