贪心算法之数字组合问题

贪心算法之数字组合问题


问题:设有N个正整数,现在需要你设计一个程序,使他们连接在一起成为最大的数字。
例如3个整数 12,456,342 很明显是45634212为最大。
例如4个整数 342,45,7,98 显然为98745342最大。
例如3个整数 4671,467,3 显然46734671最大,这里有个陷阱,就是怎么安排4671和467的位置顺序。

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

题目解析:看起来好像是找哪个数字的开头元素最大,然后按照大小顺序连在一起就OK了,但实际上要麻烦一些,比如如果N太大,比较起来就很麻烦,而且如果遇到像第三个例子那样的问题,你该怎么处理呢?
有一个办法是将数字转化为字符串,用strcmp比较a+b和b+a的大小,也就知道了谁应该排在前面。不过我这儿有一个更好的办法来实现这个程序。我们从这N个数中任取两个然后比较ab和ba的大小,如果ab>ba,那么就将a排在b之前,最后按照排好的这组数按从大到小的顺序输出。


#include<iostream>  
#include<cmath>  

using namespace std;  
  
bool compare(int Num1,int Num2)          
{  
    int count1=0,count2=0;                  //分别记录Num1和Num2是几位数 
    int MidNum1 = Num1,MidNum2 = Num2;  
    while( MidNum1 )  
    {  
        ++count1;  
        MidNum1 /= 10;  
    }  
      
    while( MidNum2 )  
    {  
        ++count2;  
        MidNum2 /= 10;  
    }  
    //pow(x,n)的意思是x的n次方 
    int a = Num1 * pow(10,count2) + Num2;     //相当于把Num2接到了Num1后边 
    int b = Num2 * pow(10,count1) + Num1;      //相当于把Num1接到了Num2后边 
      
    return (a>b)? true:false;                  //如果a>b就返回true 
}
int main()  
{  
    int N;  
    cout<<"Please Enter The Number N: "<<endl;  
    cin>>N;  
    int *kk = new int [N];                  //动态分配一个数组 
    for(int i=0;i<N;i++)  
        cin>>kk[i];  
      
    int temp;  
    for(int i=0;i<N-1;i++)                //使用冒泡排序的模板 
        for(int j=0;j<N-i-1;j++)  
            if(compare(kk[j],kk[j+1]))  //此处稍微改造了一下 
            {  
                temp = kk[j];  
                kk[j] = kk[j+1];  
                kk[j+1] = temp;  
            }
      
    cout<<"The max number is:";  
    for(int i=N-1;i>=0;i--)  
        cout<<kk[i];  
    cout<<endl;  
    delete[]kk;                        //释放数组空间 
    
    return 0;  
}  
  


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值