贪心算法之数字组合问题
问题:设有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;
}