?
好久都没刷题了,今天突然特别怀念以前刷题的日子,所以就找了几道水题来做做~~呵呵
在写这篇博客之前呢,已经很明了自己已经大三了,时光匆忙,在还没来得及转过头来,就已经过了两年了大学,原来走了这么远了~~感觉再怎么样,大三还是不敢偷懒~~不过有时候还真是挺迷茫的说实话,在这里呢,真心希望能得到你们各位的建议,只要是对我未来就业有好处的,我都会虚心取纳,(BTW:我是学嵌入式方向的)万分感谢~~~
?
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
?
思路解析:
atoi()函数的功能:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('')才结束转化,并将结果返回(返回转换后的整型数)。
strtok函数原型:char *strtok(char *s, char *delim);
功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
说明:首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。
strtok在s中查找包含在delim中的字符并用NULL('/0')来替换,直到找遍整个字符串。
返回值:从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
?
通过知道了以上两个函数的介绍,那么解这道题就容易多了,代码如下:
?
#include
#include
#include
#include
#include
#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
(
) : printf
(
); } } return 0
; }
?