构造最大数
/* 题目:给定只包含正整数的数组,给出一个方法,将数组中的数拼接起来,得到的数是最大的。 例如[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; }