各位大佬帮忙看看这个代码怎么改才能实现?
#include<stdio.h>int main()
{
int n,m,i,j;
while(scanf("%d",&n)!=EOF)
{
int a;
char temp;
char b;
for(i=0;i<n;i++) scanf("%d",&a);
for(i=0;i<n;i++) b=a+'0';
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(b+b<b+b)
{
temp=b;
b=b;
b=temp;
}
}
for(i=0;i<n;i++) a=b-'0';
for(i=0;i<n;i++)
printf("%d",a);
}
return 0;
}
设有 n 个正整数,将它们连成一排,组成一个最大的多位数。例如:输入 n = 3 以及三个正整数 13, 312, 343, 则连成的最大数为 34331213
输入描述
第 1 行输入正整数个数 n, 下面 n 行输入 n 个整数,n 不大于 100, 每个正整数不超过 20 位
输出描述
一行,组成的最大整数,输入保证输出结果不超过 200 位
样例输入
4
7
13
4
246
样例输出
7424613
for(i=0;i<n;i++) scanf("%d",&a);
for(i=0;i<n;i++) b=a+'0';
你这n应该是指n个数吧,输入n个数存到a数组,又把每个数转换为字符类型存到b数组?
不说转换成字符会不会多此一举吧,这里转换的方式也没实现啊。
如果每个数都是一位数,倒是没问题。没考虑过二位数以上的情况嘛?a[]里面的数本身都可能超出ASCII的范围,再加'0'怎么可能得到字符型的数字本身。 本帖最后由 jackz007 于 2022-4-27 22:36 编辑
#include <stdio.h>
#include <string.h>
int main(void)
{
int c , d , e , i , j , k , n ;
char s , r ;
scanf("%d" , & n) ;
fflush(stdin) ;
for(i = 0 ; i < n ; i ++) {
fgets(s , 24 , stdin) ;
s) - 1] = '\0' ;
d = i ;
}
for(i = 0 ; i < n - 1 ; i ++) {
for(k = i , j = i + 1 ; j < n ; j ++) if(strcmp(s] , s]) > 0) k = j ;
e = d ;
d = d ;
d = e ;
}
for(c = i = 0 ; i < n ; i ++) for(j = 0 ; s] ; j ++) r = s] ;
r = '\0' ;
printf("%s\n" , r) ;
} jackz007 发表于 2022-4-27 22:28
如果数据是:
4
7
442
44
3
呢?
你的代码结果:744244
正确结果:7443442 本帖最后由 jackz007 于 2022-4-28 11:50 编辑
傻眼貓咪 发表于 2022-4-28 10:47
如果数据是:
4
7
看来直接用 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 == s2 ; i ++) ;
if(i == m) {
if(n1 == n2) r = 0 ;
else if(n1 < n2) r = comp(s1 , & s2) ;
else r = comp(& s1 , s2) ;
} else {
if(s1 > s2) r = 1 ;
else r = -1 ;
}
return r ;
}
int main(void)
{
int c , d , e , i , j , k , n ;
char s , r ;
scanf("%d" , & n) ;
fflush(stdin) ;
for(i = 0 ; i < n ; i ++) {
fgets(s , 24 , stdin) ;
s) - 1] = '\0' ;
d = i ;
}
for(i = 0 ; i < n - 1 ; i ++) {
for(k = i , j = i + 1 ; j < n ; j ++) if(comp(s] , s]) > 0) k = j ;
e = d ;
d = d ;
d = e ;
}
for(c = i = 0 ; i < n ; i ++) for(j = 0 ; s] ; j ++) r = s] ;
r = '\0' ;
printf("%s\n" , r) ;
}
另外,你的答案也是错的
编译、运行实况:
D:\\>g++ -o x x.c
D:\\>x
4
7
442
44
3
7444423
D:\\>
是的,正确答案应该是 7444423 而不是 7443442。 jackz007 发表于 2022-4-28 11:48
看来直接用 strcmp() 是有问题的。
代码已经修改,请你再测
哈哈,我也糊塗了{:10_266:} jackz007 发表于 2022-4-28 11:48
看来直接用 strcmp() 是有问题的。
代码已经修改,请你再测
请问fflush和fgets是c语言的函数吗?
本帖最后由 jhq999 于 2022-4-28 15:33 编辑
int comp(char *str1,char *str2)
{
int i = 0;
for (i = 0; str1&&str2; i++)
{
if (str1>str2)
{
return 1;
}
else if (str1<str2)
{
return -1;
}
}
if (str1==str2)return 0;
if (str1&&str1<str1)
{
return -1;///////////////和strcmp不同的就是这里,尾只有比头大时才大,否则就小
}
else
{
return 1;
}
}
int main()
{
int n=0;
scanf("%d",&n);
char (*num)=new char;
int *id=new int,tmp=0;
for (int i = 0; i < n; i++)
{
id=i;
scanf("%s",num);
}
for (int i = 0; i < n-1; i++)
{
for (int j = i+1; j < n; j++)
{
if (-1==comp(num],num]))
{
tmp=id;
id=id;
id=tmp;
}
}
printf("%s",num]);
}
printf("%s",num]);
delete[] num;
delete[] id;
return 0;
} 本帖最后由 jackz007 于 2022-4-28 15:10 编辑
耀耀切克闹 发表于 2022-4-28 14:05
请问fflush和fgets是c语言的函数吗?
是的,两个函数都是标准 C 库函数,适用于所有各种操作系统平台上的所有 C 编译系统。
fflush(stdin) 用于清除前面 scanf() 遗留在键盘缓冲区内的 '\n' 字符,fgets( , , stdin) 用于从键盘读取字符串。 jhq999 发表于 2022-4-28 15:02
用这组数据测一下:
4
7
446
44
3
你的结果是
7444463
但是,正确答案似乎应该是
7446443 jackz007 发表于 2022-4-28 15:21
用这组数据测一下:
你的结果是
str1&&str1<str1 jhq999 发表于 2022-4-28 15:30
comp() 必须要有这个特性,comp('454545' , '45') == 0,comp('454545' , '454') == 1 jackz007 发表于 2022-4-28 15:41
comp() 必须要有这个特性,comp('454545' , '45') == 0,comp('454545' , '454') == 1
你考虑的太全面了{:5_106:}
本帖最后由 jackz007 于 2022-4-29 21:15 编辑
楼主,你的问题解决了吗,如果已经解决,应该把对你帮助最大的帖子设置为 "最佳答案",这样,可以表明对他人帮助的肯定和感谢,同时,也是对热心助人网友起码的尊重。
页:
[1]