问题描述: 设有n个正整数,将它们连接成一排,组成一个最大的多位整数.
例如:n=3时,3个整数13,312,343,连成的最大整数为:34331213;
n=4时,4个整数7,13,4,246连接成的最大整数为7424613。
输入:第1行有一个正整数n,代表数据的个数;接下来一行为这n个具体的数字。
输出:输出连接成的最大多位数。
c++
/*①题目涉及数字的连接,可考虑把数字转换为字符串来处理,并且纯数字的字符串很容易拼接和比较大小。
②在此题中,对于字符串a,b,如果a+b>b+a,则可认为a>b。因为本题数的大小侧重在数字的最高数位上,
应该将最高数位大的那个数放在前面,而a+b和b+a这两个字符串的位数相同,如果a+b>b+a,那么肯定
a的最高数位大于b的最高数位。(若最高位相同,则比较下一位,以此类推)
③对各个数字(字符串)进行排序(插入排序,选择排序,冒泡排序等)
*/
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
cout << "请输入数字的个数:" << endl;
cin >> n;
string str[100];
cout << "分别输入各个数字:" << endl;
for (int i = 0; i < n; i++)
cin >> str[i];
for (int i = 0; i < n - 1; i++) { //从第一个数字(字符串)开始,将它依次与其余的字符串做比较,然后选择较大的放在前面,
//与冒泡排序类似,不过冒泡排序刚好是将大的放在后面
for (int j = i + 1; j < n; j++) {
if (str[j] + str[i] > str[i] + str[j]){ //"+"号可直接连接两个字符串,字符串的大小比较是自左向右逐个字符相比(按ASCII值大小相比较),
//(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
string s;
s = str[i];
str[i] = str[j];
str[j] = s;
}
}
}
for (int i = 0; i < n; i++)
cout << str[i];
return 0;
}