题目大意:给你n个正整数,求将这n个整数重新组合后组成的最大正整数。例:给定n个正整数分别为:90,901 ,89.这三个正整数共有6种组合方法最大的为(9090189)结果输出这个数。
题目思路:本题就是一个字符串排序问题,关键问题是如何排序,这里需要用到几个字符串处理函数。
strcpy(s1,s2)将s2的所有内容复制给s1。
strcat(s1,s2),将s2的所有内容拼接在s1之后,形成一个新的s1串,长度是原来的s1+s2之和。
strcmp(s1,s2);从左到右比较两个字符串,遇到结束符或者字符串不相等时退出,当s1==s2时返回0,s1小于s2时返回-1
s1大于s2时返回1。
我们只需要将输入的所有字符串从“大”到小排序即可,大的在前面,那么我们比较两个字符串的大小时,只需要将他们组合成一个新的字符串,然后比较这个新的字符串的大小,就可决定谁应该在前面。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define MAX 55
#define MAXN 200
char map[MAX][MAXN];
int cmp(const void *aa,const void *bb)
{
char *a=(char *)aa;
char *b=(char *)bb;
char sa[MAXN*2],sb[MAXN*2];
strcpy(sa,a);
strcat(sa,b);
strcpy(sb,b);
strcat(sb,a);
return -strcmp(sa,sb);
}
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
if (n==0)
break;
int i;
for (i=0;i<n;i++)
{
scanf("%s",map[i]);
}
qsort(map,n,MAXN*sizeof(char),cmp);
for (i=0;i<n;i++)
{
printf("%s",map[i]);
}
printf("\n");
}
return 0;
}