鱼C论坛

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

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

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

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

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

x
#include<stdio.h>
int main()
{
        int n,m,i,j;
        while(scanf("%d",&n)!=EOF)
        {
                int a[n];
                char temp;
                char b[n];
                for(i=0;i<n;i++) scanf("%d",&a[i]);
                for(i=0;i<n;i++) b[i]=a[i]+'0';
                for(i=0;i<n-1;i++)
                   for(j=i+1;j<n;j++)
                   {
                           if(b[i]+b[j]<b[j]+b[i])
                           {
                                   temp=b[i];
                                   b[i]=b[j];
                                   b[j]=temp;
                           }
                   }
                for(i=0;i<n;i++) a[i]=b[i]-'0';
                for(i=0;i<n;i++)
                   printf("%d",a[i]);
        }
        return 0;
}
设有 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 编辑
int comp(char *str1,char *str2)
{
        int i = 0;
        for (i = 0; str1[i]&&str2[i]; i++)
        {
                if (str1[i]>str2[i])
                {
                        return 1;
                }
                else if (str1[i]<str2[i])
                {
                        return -1;
                }
        }
        if (str1[i]==str2[i])return 0;
        if (str1[i]&&str1[i]<str1[0])
        {
                        return -1;///////////////和strcmp不同的就是这里,尾只有比头大时才大,否则就小
        }
        else
        {
                return 1;
        }
}
int main()
{
        int n=0;
        scanf("%d",&n);
        char (*num)[24]=new char[n][24];
        int *id=new int[n],tmp=0;
        for (int i = 0; i < n; i++)
        {
                id[i]=i;
                scanf("%s",num[i]);
        }
        for (int i = 0; i < n-1; i++)
        {
                for (int j = i+1; j < n; j++)
                {
                        if (-1==comp(num[id[i]],num[id[j]]))
                        {
                                tmp=id[i];
                                id[i]=id[j];
                                id[j]=tmp;
                        }
                }
                printf("%s",num[id[i]]);
        }
        printf("%s",num[id[n-1]]);
        delete[] num;
        delete[] id;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-27 21:50:43 | 显示全部楼层
for(i=0;i<n;i++) scanf("%d",&a[i]);
for(i=0;i<n;i++) b[i]=a[i]+'0';
你这n应该是指n个数吧,输入n个数存到a数组,又把每个数转换为字符类型存到b数组?
不说转换成字符会不会多此一举吧,这里转换的方式也没实现啊。
如果每个数都是一位数,倒是没问题。没考虑过二位数以上的情况嘛?a[]里面的数本身都可能超出ASCII的范围,再加'0'怎么可能得到字符型的数字本身。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main(void)
{
        int c , d[100] , e , i , j , k , n                                                    ;
        char s[100][24] , r[2004]                                                             ;
        scanf("%d" , & n)                                                                     ;
        fflush(stdin)                                                                         ;
        for(i = 0 ; i < n ; i ++) {
                fgets(s[i] , 24 , stdin)                                                      ;
                s[i][strlen(s[i]) - 1] = '\0'                                                 ;
                d[i] = i                                                                      ;
        }
        for(i = 0 ; i < n - 1 ; i ++) {
                for(k = i , j = i + 1 ; j < n ; j ++) if(strcmp(s[d[j]] , s[d[k]]) > 0) k = j ;
                e = d[i]                                                                      ;
                d[i] = d[k]                                                                   ;
                d[k] = e                                                                      ;
        }
        for(c = i = 0 ; i < n ; i ++) for(j = 0 ; s[d[i]][j] ; j ++) r[c ++] = s[d[i]][j]     ;
        r[c] = '\0'                                                                           ;
        printf("%s\n" , r)                                                                    ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

你的代码结果:744244
正确结果:7443442
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

int comp(char s1[] , char s2[])
{
        int i , m , r , n1 , n2                                                               ;
        n1 = strlen(s1)                                                                       ;
        n2 = strlen(s2)                                                                       ;
        m = (n1 < n2) ? n1 : n2                                                               ;
        for(i = 0 ; i < m && s1[i] == s2[i] ; i ++)                                           ;
        if(i == m) {
                if(n1 == n2) r = 0                                                            ;
                else if(n1 < n2) r = comp(s1 , & s2[i])                                       ;
                else r = comp(& s1[i] , s2)                                                   ;
        } else {
                if(s1[i] > s2[i]) r = 1                                                       ;
                else r = -1                                                                   ;
        }
        return r                                                                              ;
}

int main(void)
{
        int c , d[100] , e , i , j , k , n                                                    ;
        char s[100][24] , r[2004]                                                             ;
        scanf("%d" , & n)                                                                     ;
        fflush(stdin)                                                                         ;
        for(i = 0 ; i < n ; i ++) {
                fgets(s[i] , 24 , stdin)                                                      ;
                s[i][strlen(s[i]) - 1] = '\0'                                                 ;
                d[i] = i                                                                      ;
        }
        for(i = 0 ; i < n - 1 ; i ++) {
                for(k = i , j = i + 1 ; j < n ; j ++) if(comp(s[d[j]] , s[d[k]]) > 0) k = j   ;
                e = d[i]                                                                      ;
                d[i] = d[k]                                                                   ;
                d[k] = e                                                                      ;
        }
        for(c = i = 0 ; i < n ; i ++) for(j = 0 ; s[d[i]][j] ; j ++) r[c ++] = s[d[i]][j]     ;
        r[c] = '\0'                                                                           ;
        printf("%s\n" , r)                                                                    ;
}
        另外,你的答案也是错的
        编译、运行实况:
D:\[00.Exercise]\[C]>g++ -o x x.c

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

D:\[00.Exercise]\[C]>
        是的,正确答案应该是 7444423 而不是 7443442
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


哈哈,我也糊塗了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请问fflush和fgets是c语言的函数吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 15:02:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-4-28 15:33 编辑
int comp(char *str1,char *str2)
{
        int i = 0;
        for (i = 0; str1[i]&&str2[i]; i++)
        {
                if (str1[i]>str2[i])
                {
                        return 1;
                }
                else if (str1[i]<str2[i])
                {
                        return -1;
                }
        }
        if (str1[i]==str2[i])return 0;
        if (str1[i]&&str1[i]<str1[0])
        {
                        return -1;///////////////和strcmp不同的就是这里,尾只有比头大时才大,否则就小
        }
        else
        {
                return 1;
        }
}
int main()
{
        int n=0;
        scanf("%d",&n);
        char (*num)[24]=new char[n][24];
        int *id=new int[n],tmp=0;
        for (int i = 0; i < n; i++)
        {
                id[i]=i;
                scanf("%s",num[i]);
        }
        for (int i = 0; i < n-1; i++)
        {
                for (int j = i+1; j < n; j++)
                {
                        if (-1==comp(num[id[i]],num[id[j]]))
                        {
                                tmp=id[i];
                                id[i]=id[j];
                                id[j]=tmp;
                        }
                }
                printf("%s",num[id[i]]);
        }
        printf("%s",num[id[n-1]]);
        delete[] num;
        delete[] id;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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) 用于从键盘读取字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

用这组数据测一下:
4
7
446
44
3
你的结果是
7444463
但是,正确答案似乎应该是
7446443
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的结果是

str1[i]&&str1[i]<str1[0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

        comp() 必须要有这个特性,comp('454545' , '45') == 0,comp('454545' , '454') == 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你考虑的太全面了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 20:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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