设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
方法就是把数字做为字符串来排序,排序的比较原则是:两个数字串A,B,如果AB < BA,则A < B
首先证明方法正确性:如果A小于其他所有数字串,则A应该在最前面
假设某个A在中间的连接小于以A开头的连接,则为.....MA....,因为AM < MA,所以AM.... < MA....,
所以把MA换成AM会变小。同理可知把A移到开头最小。
然后具体比较方法:比较字符串的连接
ab|adcde 31|312
abcde|ab 312|31
拿abcdeab和abcdeab比较 31312和31231比较
#include<iostream>
#include<cstring>
#include<vector>
#include <algorithm>
using namespace std;
bool cmp(const string &x,const string &y)
{
return (x+y).compare(y+x)<0;
}
int main()
{
vector<string> v;
int a[]={55,31,312,33};
char str[100];
for(int i=0;i<sizeof(a)/sizeof(int);i++)
{
itoa(a[i],str,10);//将整十进制整数转化为字符串存放在str中
v.push_back(str);
}
sort(v.begin(),v.end(),cmp);
for (int k=0;k<v.size();k++)
{
cout<<v[k]<<endl;
}
for(int j=1;j<v.size();j++)
{
v[0].append(v[j]);
}
int result=atoi(v[0].c_str());
cout<<"结果"<<result<<endl;
return 0;
}
主要思想:把整数变成字符串,然后插入vector中,使用sort算法排序,自定义排序方式,即可!
法二
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string num;
vector<string> v;
while (cin >> num)
{
v.push_back(num);
}
sort(v.begin(), v.end(), [](const string& s1, const string& s2) -> bool {
return (s1 + s2).compare(s2 + s1) < 0;
});
for_each(v.begin(), v.end(), [](string s) { cout << s; });
cout << endl;
system("pause");
return 0;
}
c 语言程序例子:
#include <stdio.h>
int main(){
int i,n,L=0;
static char s[20];
printf("input n:\n"); scanf("%d",&n);
printf("input %d positive int data:\n",n);
for (i=0;i<n;i++){ scanf("%s",s);L=L+strlen(s);};
printf("max %d digits\n",L);
return 0;
}
输入例子:
input n:
5
input 5 positive int data:
1 23 45 678 90
max 10 digits