题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
书上那个,两个数m和n,如果拼接后mn<mn则定义m小于n,反之,如果mn>mn则定义m大于n。可以根据构建一个比较函数,定义从小到大排序即可。(证明书上有,我也没仔细看)
代码:
#include <iostream>
#include <vector>
#include<algorithm>
#include<string>
using namespace std;
int bits(int x){ //x有多少位数
int num = 0;
while (x) {
x = x / 10;
num++;
}
return num;
}
bool cmp(int a, int b) { //核心比较函数
int ab = a * int(pow(10, bits(b))) + b;
int ba = b * int(pow(10, bits(a))) + a;
if (ab < ba) return true;
else return false;
}
int main()
{
int input[] = {3,321,32};
sort(input,input+3,cmp);
string res;
for (int x : input) {
res += to_string(x);
}
int out = stoi(res);
cout << out << endl; //321323
return 0;
}
结果: