1038. Recover the Smallest Number
Given a collection of number segments, you are supposed to recover the smallest number from them. For example, given {32, 321, 3214, 0229, 87}, we can recover many numbers such like 32-321-3214-0229-87 or 0229-32-87-321-3214 with respect to different orders of combinations of these segments, and the smallest number is 0229-321-3214-32-87.
Input Specification:
Each input file contains one test case. Each case gives a positive integer N (<=10000) followed by N number segments. Each segment contains a non-negative integer of no more than 8 digits. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the smallest number in one line. Do not output leading zeros.
Sample Input:5 32 321 3214 0229 87Sample Output:
22932132143287
逐次比较的过程可以采用递归或者是循环,递归看上去简洁,这里就采用了递归的写法
#if 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN(a,b) ((a) < (b) ? (a):(b))
int cmpstr(char *a,char *b,int n)
{
int alen = strlen(a);
int blen = strlen(b);
if(strncmp(a,b,n) == 0)
return cmpstr(a+n,b,n);
else
return strncmp(a,b,n);
}
int cmp(const void *a,const void *b)
{
int alen = strlen(( char*)a);
int blen = strlen(( char*)b);
int min = MIN(alen,blen);
if(min == blen)
return cmpstr(( char*)a,( char *)b,min);
else
return cmpstr(( char*)b,( char *)a,min) < 0 ? 1 : -1;
}
#define MAXN (100000+1)
char a[MAXN][40];
int main(int argc,char *argv[])
{
int i,j;
int n;
int flag;
freopen( "D:\\Chengsq\\in.txt" , "r" ,stdin);
freopen( "D:\\Chengsq\\out.txt", "w" ,stdout);
while(scanf( "%d",&n) != EOF)
{
for(i = 0;i < n;i++)
scanf( "%s",a[i]);
qsort(a,n, sizeof(a[0]),cmp);
flag = 0;
for(i = 0;i < n;i++)
{
for(j = 0; j < strlen(a[i]);j++)
{
if(flag) //是否已经输出非零的字符
printf( "%c",a[i][j]);
else
if(a[i][j] != '0')
{
printf( "%c",a[i][j]); //输出第一个非零的字符
flag = 1;
}
}
}
if(flag ==0)
printf( "0");
printf( "\n");
}
return 0;
}
#endif