-
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000(10^7)。注意这几组测试数据:
2
34 343----->34334
43 434---->43434
思路:1.每一次从右边取最小的数字,用结构体用存数据
2.如何相等 例如23232301和23,把23的arr[]补全为:23232323,再比较
3.仍然相等例如 34 和343,则把枚举 34343和34334 再比较
复杂度O(7*n^2)
#include<iostream> #include<cstdio> #include<memory.h> using namespace std; struct node{ int num; int arr[20];//把数每一位都分解 放进arr[] 例如123,arr[]={1,2,3}; int length;//num的位数 bool isAppear;//是否已经输出 }; int main() { int n; node myArr[110]; while(scanf("%d",&n)!=EOF) { memset(myArr,0,sizeof(myArr)); for(int i=1;i<=n;i++) { scanf("%d",&myArr[i].num); int temp=myArr[i].num; int arr[10]; int index=0; while(temp!=0) { arr[++index]=temp%10; temp/=10; } myArr[i].length=index; for(int j=1;j<=index;j++) { myArr[i].arr[index-j+1]=arr[j];/** 1-index */ } } int ans; for(int i=1;i<=n;i++) { ans=-1; for(int j=1;j<=n;j++) { if(myArr[j].isAppear==false) { if(ans==-1) { ans=j; } else { int length=myArr[ans].length>myArr[j].length?myArr[ans].length:myArr[j].length; int smallNo=myArr[ans].length<myArr[j].length?ans:j;//长度较小的数字那个序号 for(int k=myArr[smallNo].length+1;k<=length;k++)///23232301 23,把较短的数字的arr[]补全 { //例如23补成23232323 if(k%myArr[smallNo].length==0) myArr[smallNo].arr[k]=myArr[smallNo].arr[myArr[smallNo].length]; else myArr[smallNo].arr[k]=myArr[smallNo].arr[k%myArr[smallNo].length]; } for(int k=1;k<=length;k++)//每一次选择最小的那个数 输出 { if(myArr[ans].arr[k]<myArr[j].arr[k]) { break; } else if(myArr[ans].arr[k]>myArr[j].arr[k]) { ans=j; break; } if(k==length)/**23和231--23123,23和234-23234 */ { long long sum1=0; for(int t=1;t<=myArr[ans].length;t++) { sum1=sum1*10+myArr[ans].arr[t]; } for(int t=1;t<=myArr[j].length;t++) { sum1=sum1*10+myArr[j].arr[t]; } long long sum2=0; for(int t=1;t<=myArr[j].length;t++) { sum2=sum2*10+myArr[j].arr[t]; } for(int t=1;t<=myArr[ans].length;t++) { sum2=sum2*10+myArr[ans].arr[t]; } if(sum1>sum2) { ans=j; } //printf("sum1=%lld***sum2=%lld\n",sum1,sum2); } } } } } printf("%d",myArr[ans].num); myArr[ans].isAppear=true; } printf("\n"); } return 0; }