算法描述
将每个数字读入之后,通过自定义的比较算法cmp进行排序sort。以49和494比较,可以看出来,想要让合并后的数字达到最大,必须要让 49大于494。也就是说假如一个数和另一个数前n位都一样,则后几位中需要有一个数字必须比前n为都大。在这样的排序规则下,48 小于 489。48 小于 4889。
因此比较算法就是,先比较相同位数的前n位,然后比较后length - n 位,后面几位只要有一个大于前n位的所有数字就可以判断大小了。
题目描述
设有 n 个正整数,将它们连成一排,组成一个最大的多位数。例如:输入 n = 3 以及三个正整数 13, 312, 343, 则连成的最大数为 34331213
输入描述
第 1 行输入正整数个数 n, 下面 n 行输入 n 个整数,n 不大于 100, 每个正整数不超过 20 位
输出描述
一行,组成的最大整数,输入保证输出结果不超过 200 位
样例输入
4
7
13
4
246
样例输出
7424613
代码如下
#include<bits/stdc++.h>
using namespace std;
/*
4
7
13
4
246
*/
bool compare(string &Big, string &Little) {
for (int i = 0; i < Little.length(); i++)
{
if (Big[i] > Little[i])
return 1;
if (Big[i] < Little[i])
return 0;
}
for (int i = Little.length(); i < Big.length(); i++)
{
for (int j = 0; j < Little.length(); j++)
{
if (Big[i]>Little[j])
{
return 1;
}
}
}
return 0;
}
bool cmp(string a, string b) {
if (a.length() != b.length() && a[0] == b[0])
{
if (a.length()>b.length())
{
if (compare(a, b))
return 1;//大的在前
return 0;
}
else {
if(compare(b, a))
return 0;//大的在前
return 1;
}
}
else {
return a > b;
}
}
int main() {
int n;
while (cin>>n)
{
vector<string> array(n);
for (int i = 0; i < array.size(); i++)
{
cin >> array[i];
}
sort(&array[0], &array[0] + n, cmp);
for (int i = 0; i < array.size(); i++)
{
cout << array[i];
}
cout << endl;
}
return 0;
}