题目描述 Description
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
输入描述 Input Description
第一行一个正整数n。
第二行n个正整数,空格隔开。
输出描述 Output Description
连接成的多位数。
样例输入 Sample Input
Sample 1:
3
13 312 343
Sample 2:
4
7 13 4 246
样例输出 Sample Output
Sample 1:
34331213
Sample 2:
7424613
数据范围及提示 Data Size & Hint
n≤20
这题我使用纯C写的,用C++的sort会更容易些。思路是对冒泡排序的排序条件进行适当的修改,然后直接输出即可
#include <stdio.h>
#include <string.h>
#define M 21
#define N 15
void swap(char *a,char *b);
void sort(char num[M][N],int n);
int main(void)
{
int n=0;
char num[M][N]={0};
int i=0,j=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",num[i]);
}
sort(num,n);
for(j=0;j<n;j++)
{
printf("%s",num[j]);
}
}
void swap(char *a,char *b) //交换两个字符串
{
char tmp[N];
strcpy(tmp,a);
strcpy(a,b);
strcpy(b,tmp);
}
void sort(char num[M][N],int n) //修改过后的冒泡排序
{
int i=0,j=0,k=0;
int a=0,b=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
a = num[j][k]-'0',b = num[j+1][k]-'0';
if(a<b){
swap(num[j],num[j+1]);
k=0;
continue;
}
else if(a==b&&num[j][k]!='\0'&&num[j+1][k]!='\0'){ //如果此位相等,则K++,读取第二位
k++;
j--;
}
}
}
}