题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 //============================================================================ // Name : 100题之把数组排成最小的数.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include<stdlib.h> #include<stdio.h> #include<string.h> using namespace std; const int LEN=10; char *s1=new char[LEN*2+1]; char *s2=new char[LEN*2+1]; int Comp(const void *p1,const void *p2) { strcpy(s1,*(const char **)p1); strcat(s1,*(const char **)p2); strcpy(s2,*(const char **)p2); strcat(s2,*(const char **)p1); return strcmp(s1,s2); } void PrintMinNumber(int *numbers,int length) { char **str=new char*[length]; for(int i=0;i<length;i++) { str[i]=new char[LEN]; memset(str[i],sizeof(str[i]),'/0'); sprintf(str[i],"%d",numbers[i]); } qsort(str,length,sizeof(char*),Comp); for(int i=0;i<length;i++) { for(int j=0;j<strlen(str[i]);j++) cout<<str[i][j]; } cout<<endl; delete []s1; delete[]s2; for(int i=0;i<length;i++) delete []str[i]; s1=NULL; s2=NULL; } //int cmp1(const void *a, const void *b){ // return strcmp((const char *)a,(const char *)b); //} // //char s[2001][1001]; int main() { int numbers[3]={32,14,234}; PrintMinNumber(numbers,3); // int i,n; // scanf("%d",&n); // getchar(); // for(i=0;i<n;i++) gets(s[i]); // qsort(s,n,1001*sizeof(char),cmp1); // for(i=0;i<n;i++) puts(s[i]); // return 0; return 0; }