题目
设有n个正整数(n ≤ 20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
- 大意
将一串数字排序,最后首尾相连,组成一个最大的数 - 思路
- 显然,最高位越大的排在越前面;
- 若最高为相同,则应该比较“谁排在谁前面更大”。
比如:数字A = 312, 数字B= 323
即有两种情况:
1.A排在B前面: 312323
2.B排在A前面: 323312
显然,B排在A前面 数更大
- 注意
- 两位数和三位数谁在前谁在后,都用以上方法比较
- 代码
#include<iostream> #include<algorithm> using namespace std; string str[22]; bool judge(string a, string b){//按最高位排序 return (int)(a[0] - '0') > (int)(b[0] - '0'); } int changeNum(string s){//将字符串转换为数字 int num = 0; for(int i = 0; s[i] != '\0'; i++){ num = num * 10 + s[i] - '0'; } return num; } int combine(int a, int b){//a + b组合:a在前 b在后 int sum = a; int x[30]; //储存b数中的各个位的数 int i = 0; while(b != 0){ x[i] = b % 10; b /= 10; i++; } for(int j = i - 1; j >= 0; j){//x中的储存顺序:个位 十位 百位 ... sum = sum * 10 + x[j]; } return sum; } bool compare(int a, int b){//假设 : ab > ba if(combine(a,b) > combine(b, a)){ return true; }else{ return false; } } int main() { int n; cin >> n; for(int i = 0; i < n; i++){ cin >> str[i]; } sort(str, str + n, judge); for(int i = 0; i < n - 1; i++){ if(str[i][0] == str[i + 1][0] ){ int a = changeNum(str[i]); int b = changeNum(str[i + 1]); if(!compare(a, b)){ swap(str[i], str[i + 1]); } } } for(int i = 0; i < n; i++){ cout << str[i]; } return 0; } - 看了别人的题解:
- 1.对C++语言的熟练度还不够,字符串可以直接相加拼起来,直接用"<"、">"、"="等符号按字典序排序
- 2.这个题本质就是“谁排在谁前面更大”,直接就能解决。
#include<iostream> #include<algorithm> using namespace std; string str[22]; bool cmp(string a, string b){ return a + b > b + a; } int main() { int n; cin >> n; for(int i = 0; i < n; i++){ cin >> str[i]; } sort(str, str + n, cmp); for(int i = 0; i < n; i++){ cout << str[i]; } return 0; }



京公网安备 11010502036488号