/*
题目:给定只包含正整数的数组,给出一个方法,将数组中的数拼接起来,得到的数是最大的。
例如[4,94,9,14,1]拼接之后所得的最大数为:9944141
*/
#include <iostream>
#include <assert.h>
using namespace std;
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int get_digit(int x)//得到数x的位数,个位返回1,十位返回2,以此类推
{
int n = 0;
while(x % 10)
{
++n;
x /= 10;
}
return n;
}
int pow(int n, int base)//求base的n次幂
{
int res = 1;
for (int i = 0; i < n; ++i)
{
res *= base;
}
return res;
}
int get_new_num(int lhs, int rhs)//利用lhs和rhs构造一个新数,其中lhs在高位,rhs在低位
{
int n = get_digit(rhs);
int res = lhs * pow(n, 10) + rhs;
return res;
}
void get_max_num(int *array, int len)//得到构造的最大数,改变原数组内的元素次序
{
assert(NULL != array);
int tmp, left_num, right_num;
bool is_changed = true;
while(is_changed)//循环直到遍历一轮数组后数组没有任何改变为止,此时数组顺序存储了构造的最大数的各个位上的数
{
is_changed = false;
for(int i = 0; i != len-1; ++i)
{
left_num = get_new_num(array[i], array[i+1]);//left_num = array[i]array[i+1]
right_num = get_new_num(array[i+1], array[i]);//right_num = array[i+1]array[i]
if(left_num < right_num)//如果新构造的数left_num小于right_num,则将数组右边的数和数组左边的数交换
{
swap(&array[i], &array[i+1]);
is_changed = true;
}
}
}
}
int main(int argc, char const *argv[])
{
int array[] = {4, 94, 9, 14, 1};
int len = 5;
get_max_num(array, len);
cout<<"The max number is ";
for(int i = 0; i != len; ++i)
cout<<array[i];
cout<<endl;
return 0;
}