拼数(C++)

问题:

设有n个正整数,将他们排成一排,组成一个最大的多位整数。

 

INPUT:

第一行,正整数的个数n

第二行,n个正整数

 

OUTPUT:

一个正整数,表示最大的整数。

 

输入样例:

3

13 312 343

 

样例输出:

34331213

 

思路:

如果我们把每个输入的正整数当作正数来处理的话,

我们会发现我们很难处理。

因为存在情况一个数是另一个数的前缀的情况。

这个时候不知道要比较多少位。

比如说,4个正整数 756  212 2123 21231.

这时就很麻烦。

而如果我们把这些数字当作字符串来处理的话,过样例是没问题,

但是对于我刚刚给出那个输入可能就会出错。

因为字符串比较大小的时候不是看数的大小,而是看首字符的大小,依次递推。

比如说:

2123

21231

首字符相同,第二,三,四字符相同,那么就比较第五个字符,其中321第三个字符为1,而32没有,

所以字符串比较的时候,21231就在2123前面,而我们需要的是2123在21231前面。

这个时候需要我们自定义一种新的大小比较方式。

即:IF A+B>B+A , A>B.

如何证明呢?这里引用一下dmy大佬的作业题解:

 

 

 

然后我们对输入这些字符串进行排序,从大到小输出字符串,即可输出最大正整数。

代码如下

 1 #include<bits/stdc++.h>  //这个头文件包含了C++所有头文件
 2 using namespace std;
 3 int main()
 4 {
 5     int n;
 6     cin>>n;
 7     string t1,t2,a[n];
 8     for (int i = 0; i < n; i++) cin>>a[i];
 9     for (int i = 0; i < n-1; i++)  //为了简便明了,用选择排序
10     {
11         for (int j = i+1; j < n; j++)
12         {   //if a+b>b+a,a>b
13             t1=a[i]+a[j];
14             t2=a[j]+a[i];
15             if (t1<t2) swap(a[i],a[j]); //swap()函数在std命名空间里
16         }
17         
18     }
19     for(int i=0;i<n;i++) cout<<a[i];
20     return 0;   
21 }
posted @ 2019-12-17 22:20  Cyber_8086_hyj  阅读(1260)  评论(0编辑  收藏  举报