构造最大数

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

  

posted @ 2013-07-19 22:21  老司机  阅读(364)  评论(0编辑  收藏  举报