版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/xunalove/article/details/88296808
题目描述
对N个长度最长可达到1000的数进行排序。
输入
输入第一行为一个整数N,(1<=N<=100)。
接下来的N行每行有一个数,数的长度范围为1<=len<=1000。
每个数都是一个正数,并且保证不包含前缀零。
输出
可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。
样例输入
4
123
1234
12345
2345
样例输出
123
1234
2345
12345
冒泡排序 + 大数比较大小
大数比较大小的思路:
- 长度大者大。
- 长度小者小。
- 同长比较相同位大小。
#include<stdio.h> #include<string.h> struct bign{ int d[1001]; int len; bign() { memset(d,0,sizeof(d)); len = 0; } }; bign change(char a[])//正向存储 { bign c; for(int i=0; i<strlen(a); i++) c.d[c.len++] = a[i]-'0'; return c; } int compare(bign a, bign b)//大数比较 { if(a.len>b.len) return 1;//a大 else if(a.len<b.len) return -1;//b大 else//a.len = = b.len { for(int i=0; i<a.len; i++) { if(a.d[i]>b.d[i]) return 1; else if(a.d[i]<b.d[i]) return -1; } } return 0; } int main() { int n; while(scanf("%d",&n)!=EOF) { bign ans[110]; char a[1001]; int k=0; for(int i=0; i<n; i++) { scanf("%s",a); ans[k++] = change(a); } //采用冒泡排序 for(int i=0; i<n; i++) for(int j=0; j<n-i-1; j++) { if(compare(ans[j], ans[j+1])==1) { bign temp; temp = ans[j]; ans[j] = ans[j+1]; ans[j+1] = temp; } } for(int i=0; i<n; i++) { for(int j=0; j<ans[i].len; j++) printf("%d",ans[i].d[j]); printf("\n"); } } return 0; }