考试题目“笨笨玩游戏”
【题目描述】
一天,笨笨和妈妈玩游戏,妈妈 给笨笨出N个正整数,让笨笨把这N个正整数连接生成一个“大”的整数,每个正整数只使用一次,让笨笨告诉妈妈这样生成的大整数的最大值。
例如,给出4个整数:123, 124, 56, 90,可以连接生成的大整数有:1231245690, 1241235690, 5612312490, 9012312456, 9056124123等等,对本例,总共可以生成24个大整数。而其实最大整数是:9056124123
【输入】
第1行:1 个整数N(1<=N<=50)
第2行:N个整数,每个整数不超过INT_MAX。
【输出】
第1行:生成的最大整数。
【样例输入】
4
123 124 56 90
【样例输出】
9056124123
这道题刚开始看,觉得直接用sort就行了,结果错了 T-T
后来一想,原来有很多BUG,比如 234和2345,程序会输出 2342345
明显不是最大的,所以要自己写sort函数(天下没有白来的!!)
要考虑当两个数不一样长时,并且同样长的地方相等时要将长的尾部和短的头部作比较
代码如下:
<span style="font-size:12px;BACKGROUND-COLOR: #ffff99">#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
struct ill{
char s[100];
}a[100];
int n,i;
bool fuu(ill x,ill y)
{
int q=0,p=0;
for(int i=0;;i++)
{
if(x.s[q]<y.s[p])
return 0;
else if(x.s[q]>y.s[p])
return 1;
if(x.s[q+1]==0)
{
q=q;
if(x.s[q]<y.s[0])
return 1;
}
else
q++;
if(y.s[p+1]==0)
{
p=p;
if(y.s[p]<x.s[0])
return 0;
}
else
p++;
if(x.s[q+1]==0&&y.s[p+1]==0)
break;
}
if(x.s[q]<y.s[p])
return 0;
return 1;
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%s",a[i].s);
sort(a+1,a+1+n,fuu);
for(i=1;i<=n;i++)
printf("%s",a[i].s);
}
</span>
错了无数次
终于AC了!!