【杭电oj】1106 - 排序(模拟)

题目链接

应该算是模拟题,不过小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;
}

猜你喜欢

转载自blog.csdn.net/qq_41009682/article/details/80461299