描述
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是对这些分割得到的整数依从小到大的顺序排序。
输入
输入数据包含多行,每行为一串数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。处理到文件结束为止。
输出
对每行数字串进行分割并从小到大排序,输出排序后的结果,相邻的两个整数之间用一个空格分开。
样例输入
50051
0051231232050775
样例输出
0 1
0 77 12312320
1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 #include <math.h> 5 6 char a[1001]; 7 __int64 b[1000]; 8 9 int split(__int64 a[], int low, int high) 10 { 11 __int64 part_element=a[low]; 12 for(;;){ 13 while(low<high&&part_element<=a[high]) 14 high--; 15 if(low>=high) break; 16 a[low++]=a[high]; 17 18 while(low<high&&a[low]<=part_element) 19 low++; 20 if(low>=high) break; 21 a[high--]=a[low]; 22 } 23 a[high]=part_element; 24 return high; 25 } 26 void quicksort(__int64 a[],int low,int high) 27 { 28 int middle; 29 if(low>=high)return; 30 middle=split(a,low,high); 31 quicksort(a,low,middle-1); 32 quicksort(a,middle+1,high); 33 } 34 void deal(char *s) 35 { 36 int len,i,j,k,m,flag; 37 __int64 t=0; 38 len=strlen(s); 39 i=j=k=flag=m=0; 40 while(i<len){ 41 while(s[i]=='5') i++; 42 j=i; 43 while(j<len){ 44 if(s[j]!='5') j++; 45 else break; 46 } 47 for(k=i; k<j; k++) 48 { 49 50 t=t*10+(s[k]-48); 51 } 52 if(i<len) b[m++]=t; 53 i=j; 54 flag=0; t=0; 55 } 56 quicksort(b,0,m-1); 57 printf("%I64d",b[0]); 58 for(i=1; i<m; i++) 59 printf(" %I64d",b[i]); 60 printf("\n"); 61 } 62 63 int main() 64 { 65 while(gets(a)){ 66 deal(a); 67 } 68 return 0; 69 } 70 71
作者:xueda120
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.