链接: 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; }