首页 > 代码库 > Hdu 1106 排序 (atoi函数与 strtok函数的应用

Hdu 1106 排序 (atoi函数与 strtok函数的应用

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1106


好久都没刷题了,今天突然特别怀念以前刷题的日子,所以就找了几道水题来做做~~呵呵

在写这篇博客之前呢,已经很明了自己已经大三了,时光匆忙,在还没来得及转过头来,就已经过了两年了大学,原来走了这么远了~~感觉再怎么样,大三还是不敢偷懒~~不过有时候还真是挺迷茫的说实话,在这里呢,真心希望能得到你们各位的建议,只要是对我未来就业有好处的,我都会虚心取纳,(BTW:我是学嵌入式方向的)万分感谢~~~


Problem Description

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。

你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

Input

输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。

输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。

Output

对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。

Sample Input

0051231232050775


Sample Output

0 77 12312320


思路解析:

atoi()函数的功能:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时(‘\0‘)才结束转化,并将结果返回(返回转换后的整型数)。

strtok函数原型:char *strtok(char *s, char *delim);

功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。

说明:首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。

strtok在s中查找包含在delim中的字符并用NULL(‘/0‘)来替换,直到找遍整个字符串。

返回值:从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。

所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。


通过知道了以上两个函数的介绍,那么解这道题就容易多了,代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#define MAXN 1005
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

int Num[MAXN], cnt;
char str[MAXN], *p;

int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

int main()
{
    while(~scanf("%s", str)) {
        cnt = 0;
        p = strtok(str, "5");
        while(p != NULL) {
            Num[cnt++] = atoi(p);
            p = strtok(NULL, "5");
        }
        qsort(Num, cnt, sizeof(int), cmp);
        for(int i=0; i<cnt; i++) {
            printf("%d", Num[i]);
            i == cnt-1 ? printf("\n") : printf(" ");
        }
    }
    return 0;
}


Hdu 1106 排序 (atoi函数与 strtok函数的应用