关于一道简单的ACM题目,求解释
数字接龙
题目:给你n个数字,将这n个数字连接在一起成一个数字,数字大者为胜。
输入要求:输入多组测试数据,每组数据第一行是一个正整数n(1≤n≤10)。接下来n行每行一串字符串,长度不大于10 。
输出要求:每个测试数据输出一行,就是n串字符串连接成一串中字典序最大的那一串。
比如输入:2 输出:456123
123
456
输入:3 输出:bbabba
ba
b
bab
[解决办法]
// 并且,你需要考虑输入是多组的情况,那么代码还需要改动成下面的
// 希望你在代码这条路上不会畏惧艰难,可以走的更远。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int comp(const void *a, const void *b)
{
return strcmp((char *)b,(char *)a);
}
int main()
{
int n, k;
char a[10][10];
// 如果scanf返回EOF,那么说明输入已经结束(在OJ中是用文件输入,EOF标志文件结尾)
while (EOF != scanf("%d\n", &n))
{
for(int i=0; i<n; i++)
gets(a[i]);
qsort(a,n,10,comp);
for(int i=0; i<n; i++)
printf("%s",a[i]);
puts("");
}
return 0;
}
[解决办法]
嗯,使用STL的话,就更简单了。
string strOut;
list<string> strList;
string s1 = "123";
string s2 = "456";
string s3 = "012";
strList.push_back(s1);
strList.push_back(s2);
strList.push_back(s3);
strList.sort();
strList.reverse();
for(list<string>::iterator iter = strList.begin(); iter != strList.end(); iter++)
{
strOut.append((*iter));
}
cout << strOut << endl;
[解决办法]
楼主 你这个程序的思路错了, 你这样每次排序都是相邻之间数组的排序。如果第三个字符串介于第一个字符串和第二个字符串之间,你这种方法就不对了。你的方法已经把第一个串和第二个串合并后的结果放在a[j+1]了。