-
题目描述:
-
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
-
输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000。
-
输出:
-
对应每个测试案例,
输出m个数字能排成的最小数字。
-
样例输入:
-
3 23 13 6 2 23456 56
-
样例输出:
-
13236 2345656
-
/*思路:简单的按字典排序,注意是在cmp函数内,通过字典比较的时候,没分出结果时,我的处理是: string aa = a, bb = b ; aa = a + b ; bb = b + a; if(aa<bb) return true ; else return false ; */ #include<iostream> #include<algorithm> #include<string> #define MAX 102 using namespace std ; bool cmp (string a , string b ) { int i ; int lena = a.size() , lenb = b.size() , max1 = 0 ; max1 = lena > lenb ? lena : lenb ; for( i = 0 ; i < max1 ; i ++) { if(a[i%lena] > b[i%lenb]) return false; if(a[i%lena] < b[i%lenb]) return true ; } /*按字典比较,没有分出顺序时的处理*/ string aa = a, bb = b ; aa = a + b ; bb = b + a; if(aa<bb) return true ; else return false ; } int main(void) { int n ; while(cin >> n ){ int i ; string a[MAX] ; for(i = 0 ; i < n ; i++) cin >> a[i] ; sort(a , a + n , cmp ); for( i = 0 ; i < n ; i++) cout<< a[i]; cout<<endl; } return 0 ; } /* 3 100 1001 10004 2 1001 10011 2 100110 1001 */