问题:输入一个正整数数组,把数组里面的所有数字连接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印这三个数字能排成的最小数字321323。
这题如果按照一般的全排列,n个数字是n!个排列,实在是行不通...
这时我们需要一个排序规则:

如对321和32,排序为32132<32321,所以321<32(这个小于号并非是比较两个数的实际大小)
按照这个思想(下述是书中代码):
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int g_MaxNumberLength=10;
char* g_StrCombine1=new char[g_MaxNumberLength*2+1];
char* g_StrCombine2=new char[g_MaxNumberLength*2+1];
int compare(const void* strNumber1, const void* strNumber2) //对两个数进行比较,ab和ba的大小
{
strcpy(g_StrCombine1, *(const char**)strNumber1);
strcat(g_StrCombine1, *(const char**)strNumber2);
strcpy(g_StrCombine2, *(const char**)strNumber2);
strcat(g_StrCombine2, *(const char**)strNumber1);
return strcmp(g_StrCombine1, g_StrCombine2);
}
void PrintMinNumber(int *numbers, int length)
{
if(numbers == NULL || length <= 0)
return;
char** strNumbers = (char**)(new int[length]);
for(int i = 0; i < length; i++)
{
strNumbers[i] = new char[g_MaxNumberLength+1];
sprintf(strNumbers[i], "%d", numbers[i]); //数字转为字符串
}
qsort(strNumbers, length, sizeof(char*), compare);
for(int i = 0; i < length; i++)
cout << strNumbers[i];
cout << endl;
for(int i = 0; i < length; i++)
delete[] strNumbers[i];
delete[] strNumbers;
}
int main()
{
int num;
cout << "请输入数组的个数:";
cin >> num;
int *numbers = new int[num];
cout << "请进行输入:";
for(int i = 0; i < num; i++)
cin >> numbers[i];
PrintMinNumber(numbers, num);
return 0;
}
如上截图,输出也是正确的,至于详细证明,不再多言...见谅
O(∩_∩)O