【九度OJ】题目1190:大整数排序

参考:https://blog.csdn.net/arcsinsin/article/details/12918433

          https://blog.csdn.net/fjx1173865548/article/details/48345061

题目描述:

对N个长度最长可达到1000的数进行排序。

输入:

输入第一行为一个整数N,(1<=N<=100)。
接下来的N行每行有一个数,数的长度范围为1<=len<=1000。
每个数都是一个正数,并且保证不包含前缀零。

输出:

可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。

样例输入:

3
11111111111111111111111111111
2222222222222222222222222222222222
33333333

样例输出:

33333333
11111111111111111111111111111
2222222222222222222222222222222222

———————————————————————————————————————————————————

 

本题是对字符串二维数组的一个排序。用sort已经不行了,用qsort !(下面证明sort也是可以的,hhh)

qsort

用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

参数: 1 待排序数组首地址

2 数组中待排序元素数量

3 各元素的占用空间大小

4 指向函数的指针,用于确定排序的顺序

 

[cpp] view plain copy

  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<cstring>  
  4. #include<algorithm>  
  5. using namespace std;  
  6. const int maxn = 1002;  
  7. char s[maxn][maxn];  
  8. //请注意cmp函数的写法  
  9. int cmp(const void *a, const void *b)  
  10. {  
  11.     int len1 = strlen((char *)a);  
  12.     int len2 = strlen((char *)b);  
  13.     if (len1 == len2)  
  14.         return strcmp((char *)a,(char *)b);  
  15.     else  
  16.         return len1 - len2;  
  17. }  
  18. int main()  
  19. {  
  20.     int n, i;  
  21.     while (scanf("%d",&n) == 1)  
  22.     {  
  23.         for (i = 0; i < n; i++)  
  24.         {  
  25.             scanf("%s",s[i]);  
  26.         }  
  27.         //注意qsort四个参数的不同含义  
  28.         //特别是第三个参数:单个元素占用空间的大小  
  29.         qsort(s,n,sizeof(s[0]),cmp);  
  30.         for (i = 0; i < n; i++)  
  31.         {  
  32.             cout<<s[i]<<endl;  
  33.         }  
  34.     }  
  35.     return 0;  
  36. }  

 

 

 

 

———————————————————————————————————————————————————

 

 

[cpp] view plain copy

  1. #include<iostream>  
  2. #include<stdio.h>  
  3. #include<algorithm>  
  4. #include<string.h>  
  5.    
  6. using namespace std;  
  7. #define N 1001  
  8. struct Num{  
  9.     char num[N];  
  10.     int len;  
  11.    
  12.     bool operator < (const Num &A) const{  
  13.         if(len != A.len)  
  14.             return len < A.len;  
  15.         else{  
  16.             for(int i = 0; i < len; i++)  
  17.             {  
  18.                 if(num[i] != A.num[i])  
  19.                     return num[i] < A.num[i];  
  20.                 else  
  21.                     continue;  
  22.             }  
  23.         }  
  24.     }  
  25. }buf[101];  
  26.    
  27. int main()  
  28. {  
  29.     int n;  
  30.    
  31.     while(scanf("%d", &n) != EOF){  
  32.         for(int i = 0; i < n; i++){  
  33.             scanf("%s", buf[i].num);  
  34.             buf[i].len = strlen(buf[i].num);  
  35.         }  
  36.    
  37.         sort(buf, buf+n);  
  38.         for(int i = 0; i < n; i++){  
  39.             printf("%s\n", buf[i].num);  
  40.            // buf[i].len = strlen(buf[i].num);  
  41.         }  
  42.     }  
  43.     return 0;  
  44. }  
  45. /************************************************************** 
  46.     Problem: 1190 
  47.     User: various 
  48.     Language: C++ 
  49.     Result: Accepted 
  50.     Time:10 ms 
  51.     Memory:1624 kb 
  52. ****************************************************************/  
  53.  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值