鱼C论坛

 找回密码
 立即注册
查看: 2279|回复: 13

[已解决]各位大佬帮忙看看这个代码怎么改才能实现?

[复制链接]
发表于 2022-4-27 21:06:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int n,m,i,j;
  5.         while(scanf("%d",&n)!=EOF)
  6.         {
  7.                 int a[n];
  8.                 char temp;
  9.                 char b[n];
  10.                 for(i=0;i<n;i++) scanf("%d",&a[i]);
  11.                 for(i=0;i<n;i++) b[i]=a[i]+'0';
  12.                 for(i=0;i<n-1;i++)
  13.                    for(j=i+1;j<n;j++)
  14.                    {
  15.                            if(b[i]+b[j]<b[j]+b[i])
  16.                            {
  17.                                    temp=b[i];
  18.                                    b[i]=b[j];
  19.                                    b[j]=temp;
  20.                            }
  21.                    }
  22.                 for(i=0;i<n;i++) a[i]=b[i]-'0';
  23.                 for(i=0;i<n;i++)
  24.                    printf("%d",a[i]);
  25.         }
  26.         return 0;
  27. }
复制代码

设有 n 个正整数,将它们连成一排,组成一个最大的多位数。例如:输入 n = 3 以及三个正整数 13, 312, 343, 则连成的最大数为 34331213

输入描述
第 1 行输入正整数个数 n, 下面 n 行输入 n 个整数,n 不大于 100, 每个正整数不超过 20 位

输出描述
一行,组成的最大整数,输入保证输出结果不超过 200 位

样例输入
4
7
13
4
246

样例输出
7424613
最佳答案
2022-4-28 15:02:43
本帖最后由 jhq999 于 2022-4-28 15:33 编辑
  1. int comp(char *str1,char *str2)
  2. {
  3.         int i = 0;
  4.         for (i = 0; str1[i]&&str2[i]; i++)
  5.         {
  6.                 if (str1[i]>str2[i])
  7.                 {
  8.                         return 1;
  9.                 }
  10.                 else if (str1[i]<str2[i])
  11.                 {
  12.                         return -1;
  13.                 }
  14.         }
  15.         if (str1[i]==str2[i])return 0;
  16.         if (str1[i]&&str1[i]<str1[0])
  17.         {
  18.                         return -1;///////////////和strcmp不同的就是这里,尾只有比头大时才大,否则就小
  19.         }
  20.         else
  21.         {
  22.                 return 1;
  23.         }
  24. }
  25. int main()
  26. {
  27.         int n=0;
  28.         scanf("%d",&n);
  29.         char (*num)[24]=new char[n][24];
  30.         int *id=new int[n],tmp=0;
  31.         for (int i = 0; i < n; i++)
  32.         {
  33.                 id[i]=i;
  34.                 scanf("%s",num[i]);
  35.         }
  36.         for (int i = 0; i < n-1; i++)
  37.         {
  38.                 for (int j = i+1; j < n; j++)
  39.                 {
  40.                         if (-1==comp(num[id[i]],num[id[j]]))
  41.                         {
  42.                                 tmp=id[i];
  43.                                 id[i]=id[j];
  44.                                 id[j]=tmp;
  45.                         }
  46.                 }
  47.                 printf("%s",num[id[i]]);
  48.         }
  49.         printf("%s",num[id[n-1]]);
  50.         delete[] num;
  51.         delete[] id;
  52.         return 0;
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-27 21:50:43 | 显示全部楼层
  1. for(i=0;i<n;i++) scanf("%d",&a[i]);
  2. for(i=0;i<n;i++) b[i]=a[i]+'0';
复制代码

你这n应该是指n个数吧,输入n个数存到a数组,又把每个数转换为字符类型存到b数组?
不说转换成字符会不会多此一举吧,这里转换的方式也没实现啊。
如果每个数都是一位数,倒是没问题。没考虑过二位数以上的情况嘛?a[]里面的数本身都可能超出ASCII的范围,再加'0'怎么可能得到字符型的数字本身。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-27 22:28:07 | 显示全部楼层
本帖最后由 jackz007 于 2022-4-27 22:36 编辑
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.         int c , d[100] , e , i , j , k , n                                                    ;
  6.         char s[100][24] , r[2004]                                                             ;
  7.         scanf("%d" , & n)                                                                     ;
  8.         fflush(stdin)                                                                         ;
  9.         for(i = 0 ; i < n ; i ++) {
  10.                 fgets(s[i] , 24 , stdin)                                                      ;
  11.                 s[i][strlen(s[i]) - 1] = '\0'                                                 ;
  12.                 d[i] = i                                                                      ;
  13.         }
  14.         for(i = 0 ; i < n - 1 ; i ++) {
  15.                 for(k = i , j = i + 1 ; j < n ; j ++) if(strcmp(s[d[j]] , s[d[k]]) > 0) k = j ;
  16.                 e = d[i]                                                                      ;
  17.                 d[i] = d[k]                                                                   ;
  18.                 d[k] = e                                                                      ;
  19.         }
  20.         for(c = i = 0 ; i < n ; i ++) for(j = 0 ; s[d[i]][j] ; j ++) r[c ++] = s[d[i]][j]     ;
  21.         r[c] = '\0'                                                                           ;
  22.         printf("%s\n" , r)                                                                    ;
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 10:47:22 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-4-27 22:28


如果数据是:
4
7
442
44
3
呢?

你的代码结果:744244
正确结果:7443442
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 11:48:18 | 显示全部楼层
本帖最后由 jackz007 于 2022-4-28 11:50 编辑


         看来直接用 strcmp() 是有问题的。
         代码已经修改,请你再测
  1. #include <stdio.h>
  2. #include <string.h>

  3. int comp(char s1[] , char s2[])
  4. {
  5.         int i , m , r , n1 , n2                                                               ;
  6.         n1 = strlen(s1)                                                                       ;
  7.         n2 = strlen(s2)                                                                       ;
  8.         m = (n1 < n2) ? n1 : n2                                                               ;
  9.         for(i = 0 ; i < m && s1[i] == s2[i] ; i ++)                                           ;
  10.         if(i == m) {
  11.                 if(n1 == n2) r = 0                                                            ;
  12.                 else if(n1 < n2) r = comp(s1 , & s2[i])                                       ;
  13.                 else r = comp(& s1[i] , s2)                                                   ;
  14.         } else {
  15.                 if(s1[i] > s2[i]) r = 1                                                       ;
  16.                 else r = -1                                                                   ;
  17.         }
  18.         return r                                                                              ;
  19. }

  20. int main(void)
  21. {
  22.         int c , d[100] , e , i , j , k , n                                                    ;
  23.         char s[100][24] , r[2004]                                                             ;
  24.         scanf("%d" , & n)                                                                     ;
  25.         fflush(stdin)                                                                         ;
  26.         for(i = 0 ; i < n ; i ++) {
  27.                 fgets(s[i] , 24 , stdin)                                                      ;
  28.                 s[i][strlen(s[i]) - 1] = '\0'                                                 ;
  29.                 d[i] = i                                                                      ;
  30.         }
  31.         for(i = 0 ; i < n - 1 ; i ++) {
  32.                 for(k = i , j = i + 1 ; j < n ; j ++) if(comp(s[d[j]] , s[d[k]]) > 0) k = j   ;
  33.                 e = d[i]                                                                      ;
  34.                 d[i] = d[k]                                                                   ;
  35.                 d[k] = e                                                                      ;
  36.         }
  37.         for(c = i = 0 ; i < n ; i ++) for(j = 0 ; s[d[i]][j] ; j ++) r[c ++] = s[d[i]][j]     ;
  38.         r[c] = '\0'                                                                           ;
  39.         printf("%s\n" , r)                                                                    ;
  40. }
复制代码

        另外,你的答案也是错的
        编译、运行实况:
  1. D:\[00.Exercise]\[C]>g++ -o x x.c

  2. D:\[00.Exercise]\[C]>x
  3. 4
  4. 7
  5. 442
  6. 44
  7. 3
  8. 7444423

  9. D:\[00.Exercise]\[C]>
复制代码

        是的,正确答案应该是 7444423 而不是 7443442
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 12:47:34 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-4-28 11:48
看来直接用 strcmp() 是有问题的。
         代码已经修改,请你再测


哈哈,我也糊塗了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-28 14:05:25 | 显示全部楼层
jackz007 发表于 2022-4-28 11:48
看来直接用 strcmp() 是有问题的。
         代码已经修改,请你再测

请问fflush和fgets是c语言的函数吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 15:02:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-4-28 15:33 编辑
  1. int comp(char *str1,char *str2)
  2. {
  3.         int i = 0;
  4.         for (i = 0; str1[i]&&str2[i]; i++)
  5.         {
  6.                 if (str1[i]>str2[i])
  7.                 {
  8.                         return 1;
  9.                 }
  10.                 else if (str1[i]<str2[i])
  11.                 {
  12.                         return -1;
  13.                 }
  14.         }
  15.         if (str1[i]==str2[i])return 0;
  16.         if (str1[i]&&str1[i]<str1[0])
  17.         {
  18.                         return -1;///////////////和strcmp不同的就是这里,尾只有比头大时才大,否则就小
  19.         }
  20.         else
  21.         {
  22.                 return 1;
  23.         }
  24. }
  25. int main()
  26. {
  27.         int n=0;
  28.         scanf("%d",&n);
  29.         char (*num)[24]=new char[n][24];
  30.         int *id=new int[n],tmp=0;
  31.         for (int i = 0; i < n; i++)
  32.         {
  33.                 id[i]=i;
  34.                 scanf("%s",num[i]);
  35.         }
  36.         for (int i = 0; i < n-1; i++)
  37.         {
  38.                 for (int j = i+1; j < n; j++)
  39.                 {
  40.                         if (-1==comp(num[id[i]],num[id[j]]))
  41.                         {
  42.                                 tmp=id[i];
  43.                                 id[i]=id[j];
  44.                                 id[j]=tmp;
  45.                         }
  46.                 }
  47.                 printf("%s",num[id[i]]);
  48.         }
  49.         printf("%s",num[id[n-1]]);
  50.         delete[] num;
  51.         delete[] id;
  52.         return 0;
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 15:09:40 | 显示全部楼层
本帖最后由 jackz007 于 2022-4-28 15:10 编辑
耀耀切克闹 发表于 2022-4-28 14:05
请问fflush和fgets是c语言的函数吗?


        是的,两个函数都是标准 C 库函数,适用于所有各种操作系统平台上的所有 C 编译系统。
        fflush(stdin) 用于清除前面 scanf() 遗留在键盘缓冲区内的 '\n' 字符,fgets( , , stdin) 用于从键盘读取字符串。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 15:21:56 | 显示全部楼层

用这组数据测一下:
  1. 4
  2. 7
  3. 446
  4. 44
  5. 3
复制代码

你的结果是
  1. 7444463
复制代码

但是,正确答案似乎应该是
  1. 7446443
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 15:30:00 | 显示全部楼层
jackz007 发表于 2022-4-28 15:21
用这组数据测一下:

你的结果是

  1. str1[i]&&str1[i]<str1[0]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 15:41:16 | 显示全部楼层

        comp() 必须要有这个特性,comp('454545' , '45') == 0,comp('454545' , '454') == 1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 16:10:28 | 显示全部楼层
jackz007 发表于 2022-4-28 15:41
comp() 必须要有这个特性,comp('454545' , '45') == 0,comp('454545' , '454') == 1

你考虑的太全面了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-29 21:13:36 | 显示全部楼层
本帖最后由 jackz007 于 2022-4-29 21:15 编辑

        楼主,你的问题解决了吗,如果已经解决,应该把对你帮助最大的帖子设置为 "最佳答案",这样,可以表明对他人帮助的肯定和感谢,同时,也是对热心助人网友起码的尊重。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 10:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表