题目描述
设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 n n n。
第二行有 n n n 个整数,表示给出的 n n n 个整数 a i a_i ai。
输出格式
一个正整数,表示最大的整数
样例 #1
样例输入 #1
3
13 312 343
样例输出 #1
34331213
样例 #2
样例输入 #2
4
7 13 4 246
样例输出 #2
7424613
提示
对于全部的测试点,保证 1 ≤ n ≤ 20 1 \leq n \leq 20 1≤n≤20, 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1≤ai≤109。
思路:相邻数字首尾相接,定义成字符串,排成最大的整数,说明要进行排序,但是使用从大到小的排序是行不通的,例如9和1111,最大的数是91111,但是1111>9,会排成11119.
在进行字符串的比较时,先比较长度在比较大小
//思路:相邻数字首尾相接,定义成字符串,排成最大的整数,说明要进行排序,但是使用从大到小的排序是行不通的
//例如9和1111,最大的数是91111,但是1111>9,会排成11119
//数字首尾相接=字符串相加
#include <stdio.h>
#include <string.h>
#include <math.h>
//定义结构体
struct stu
{
char num[21];
}stu[21];
//自定义比较函数
int compare(char l1[],char l2[])
{
char a[100],b[100];
int flag=0;
strcpy(a,l1);//字符串复制函数,为了避免影响原来的数组
strcpy(b,l2);
int k1=strlen(a);//字符串长度函数
int k2=strlen(b);
//先将两个字符串变成一样的长度 ,短的进行循环一下,直到两个字符一样长为止
if(k1>k2){
while(k1>strlen(b)){
strcat(b,b);//字符串连接函数
}
b[k1]='\0';
}
else if(k2>k1){
while(k2>strlen(a)){//注意while与if的区别
strcat(a,a);
}
a[k2]='\0';//此时等长
}
flag=strcmp(a,b);//直接用字符串比较函数;a>b则出现1;否则-1,相等0;
return flag;
}
int main()
{
int n,k;
scanf("%d",&n);
for(int i=1;i<=n;i++){//改习惯i=1开始循环,方便下标的标记
scanf("%s",stu[i].num);
}
//选择排序
for(int i=1;i<n;i++){
k=i;
for(int j=i+1;j<=n;j++){
if(compare(stu[j].num,stu[k].num)>0){
k=j;
}
}
if(k!=i){
strcpy(stu[0].num,stu[i].num);//字符串复制函数
strcpy(stu[i].num,stu[k].num);//覆盖原先的数组
strcpy(stu[k].num,stu[0].num);
}
}
for(int i=1;i<=n;i++){
printf("%s",stu[i].num);//依次输出即可如连接到一起
}
return 0;
}