HDU 1106 排序

HDU1106排序题解析

字符串处理+排序

排序直接用stdlib.h中的qsort()了

qsort(void *base, size_t num, size_t width, int (__fileDECL *comp)(const void *, const void *));

*comp函数要自己写(排序规则)

 

int *atoi(const char *str);

将字符串str转换成整型数

字符串中第一个字符可以是+、-

第一个字符合法后就开始做类型转换遇到(非数字字符和'\0')结束

第一个字符不合法,函数默认返回0

 

extern char *strtok(char *str, char *dilimiter);

就不知道怎么说了,模仿了会用而已...T.T

第一次调用时第一个参数是字符串首地址,第二次调用时第一个参数是NULL

第二个参数是要分隔的字符串, 开始直接传字符进去了,悲剧了...

 

2010-12-26  17:06:57  Accepted  1106  0MS  208K  1072 B  C  Y

代码

      
#include < stdio.h >
#include
< stdlib.h >
#include
< string .h >
#define N 1010

void deal_data( char * str, int * num, int * len); /* 转换成整型数组 */
int sort_function( const void * a, const void * b); /* 排序规则 */
void print( int * num, int len); /* 输出 */

int main()
{
char str[N];
int num[N], len;

while (scanf( " %s " , str) != EOF)
{
memset(num,
0 , sizeof (num));
deal_data(str, num,
& len);
qsort(num, len,
sizeof ( int ), sort_function);
print(num, len);
}

return 0 ;
}

void print( int * num, int len)
{
int i;

for (i = 0 ; i < len; i ++ )
{
printf(i
? " %d " : " %d " , num[i]);
}
putchar(
' \n ' );
}

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

void deal_data( char * str, int * num, int * len)
{
int i, s_len, n_len, value;
char index, * ptr;

n_len
= 0 ;
ptr
= strtok(str, " 5 " );
num[n_len
++ ] = atoi(ptr);
while (ptr = strtok(NULL, " 5 " ))
{
num[n_len
++ ] = atoi(ptr);
}
* len = n_len;
}

 

/*
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的
若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,
除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),
这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。

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

Sample Input
0051231232050775

Sample Output
0 77 12312320
*/

 

posted on 2010-12-26 17:50 PeckChen 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/xyoung/archive/2010/12/26/1917281.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值