数字组合问题!

设有N个正整数,现在需要你设计一个程序,使他们连接在一起成为最大的数字,例3个整数 12,456,342 很明显是45634212为最大,4个整数 342,45,7,98显然为98745342最大

程序要求:输入整数N 接下来一行输入N个数字,最后一行输出最大的那个数字!

题目解析:拿到这题目,看起要来也简单,看起来也难,简单在什么地方,简单在好像就是寻找哪个开头最大,然后连在一起就是了,难在如果N大了,假如几千几万,好像就不是那么回事了,要解答这个题目需要选对合适的贪心策略,并不是把数字由大排到小那么简单,网上的解法是将数字转化为字符串,比如a+b和b+a,用strcmp函数比较一下就知道谁大,也就知道了谁该排在谁前面,不过我觉得这个完全没必要。

这里有一个求,巧妙的算法

可以将冒泡程序改一下,将规则改一下就行了,代码如下,自已认真理解

#include<iostream>
#include <cmath>  
using namespace std;  
bool compare(int Num1,int Num2)  //改的规则<<<<<<
{  
    int count1,count2;  
    int MidNum1 = Num1,MidNum2 = Num2;  
    while( MidNum1 )  
    {  
        ++count1;  
        MidNum1 /= 10;  
    }  
  
    while( MidNum2 )  
    {  
        ++count2;  
        MidNum2 /= 10;  
    }  
  
    int a = Num1 * pow(10,count2) + Num2;  
    int b = Num2 * pow(10,count1) + Num1;  
  
    return (a>b)? true:false;  
}
int main(int argc, char* argv[])  
{  
    int N;  
    cout<<"please enter the number n:"<<endl;  
    cin>>N;  
    int *array = new int [N];  
    for(int i=0;i<N;i++)  
        cin>>array[i];  
      
    int temp;  
    for(i=0; i<=N-1 ; ++i)  //用冒泡,
    {  
        for(int j=0;j<N-i-1;j++)  
            if( compare(array[j],array[j+1]) )  
            {  
                temp = array[j];  
                array[j] = array[j+1];  
                array[j+1] = temp;  
            }  
    }  
      
    cout<<"the max number is:";  
    for( i=N-1 ; i>=0 ; --i)  
        cout<<array[i];  
    cout<<endl;  
    delete [] array;  
    system("pause");  
    return 0;  
}  
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值