拼数(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 }