题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印出能拼接出的所有数字中的最小的一个。
分析:考虑到整数拼接起来会超出整数范围,所以涉及大数问题,用字符串处理。两个数字m和n能拼接成mn或者nm,如果mn大于nm,那么n应该放在m前面,反之m放在n前面,多个整数道理一样。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max_num_len 5 //整数数组中可能最大数的位数
char *strcombine1 = new char[Max_num_len*2+1];
char *strcombine2 = new char[Max_num_len*2+1];
int cmp(const void *str1, const void *str2)
{
strcpy(strcombine1,*(const char**)str1);
strcat(strcombine1,*(const char**)str2);
strcpy(strcombine2,*(const char**)str2);
strcat(strcombine2,*(const char**)str1);
return strcmp(strcombine1,strcombine2);
}
void print_num(int a[], int len)
{
if(a==NULL || len<=0)
return;
char **str = new char*[len];
int i;
for(i=0;i<len;i++)
{
str[i] = new char[Max_num_len + 1];
sprintf(str[i],"%d",a[i]);//整数转换成字符串
}
qsort(str,len,sizeof(char*),cmp);
for(i=0;i<len;i++)
printf("%s",str[i]);
printf("\n");
for(i=0;i<len;i++)
delete [] str[i];
delete str;
}
int main()
{
int a[] = {3,32,321};
int len = sizeof(a)/sizeof(int);
int i;
printf("数组为:\n");
for(i=0;i<len;i++)
printf("%d\t",a[i]);
printf("\n");
printf("数组拼接后最小的数为:\n");
print_num(a,len);
return 0;
}