題目大意:給你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;
}