最大数串问题
题目描述:
设有n个正整数,将他们连接成一排,组成一个最大的多位数。
如:n=3时,3个整数13,312,343,连接成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成最大整数为7424613。
输入描述:
有多组测试样例,每组测试样例包含两行,第一行为一个整数N(N<=100),第二行包含N个数(每个数不超过1000,空格分开)。
输出描述:
每组数据输出一个表示最大的整数。
样例:
思路分析:
一:明显我们不能直接比较他们的大小,
二:接下来,有的人可能就会去比较两个数的最高位,然后次高位,直至最后,所以我们要去获取每个数的每一位数,这样就会 特别麻烦,因此所以我们用string来存储每一个数字,这样取每一位都比较容易 。但是这种思想是 错误的。
比如我们来看963 和 96,因为96没有第三高位所以按道理来说963应该在96前面就是96396,但是96396没有96963大,
那么我们在判断96没有第三高位时,此时我们就要在从96的第一高位比较,直到比较出来或则位数最多的那个数比较完(也 就是最大的数)。具体实现看下图
这种思路可以实现,但是代码很麻烦。我们来看第三种思路。
三:首先我们知道我们可以通过某种方法将我们给的这些的数据进行排序,使得排序后的数据刚好是组成最大数的顺序。
既然我们是要将这些数据进行链接,比如963 和 96,我们如何盘端96应该在963之前呢???很简单啊那就是比较吗,我们设置两个中间变量,一个是96396,一个是96963,那我们比较他们的大小,当正序链接比逆序链接大的时间,那么就说明963 和 96的顺序不用变化,否则交换数据。其实就是变相的选择排序。
代码实现
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<stdlib.h>
int main(){
int i,j;
int num;
cin>>num;
vector<string>data(num);//如果我们不给容器的预大小,则我们给的容器就是一个空的,不能存放数据。
for(i=0;i<num;++i)
{
cin>>data[i];
}
string temp;
string tempa;
string tempb;
for(i=0;i<num;++i)
{
for(j=i+1;j<num;++j)
{
tempa = data[i];//正序
tempa += data[j];
tempb = data[j];//逆序
tempb+= data[i];
if(tempa < tempb)
{
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
cout<<data[i];
}
return 0;
}