題目描述:
輸入一個正整數數組,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則列印出這三個數字能排成的最小數字為321323。
輸入:
輸入可能包含多個測試範例。
對於每個測試案例,輸入的第一行為一個整數m (1<=m <=100)代表輸入的正整數的個數。
輸入的第二行包括m個正整數,其中每個正整數不超過10000000。
輸出:
對應每個測試案例,
輸出m個數字能排成的最小數字。
範例輸入:
323 13 6223456 56
範例輸出:
132362345656
思路:排序輸出即可,痛點在於排序演算法怎樣實現。
可以通過比較組合的字串的大小來排序原來的整數數組,例如 32和321比較的結果是 ”32321“>”32132″ 所以認為 32是大於321的。
AC代碼:
(經驗之談:如果題目中告訴了數組大小,那麼就不要用malloc去動態開闢記憶體了,這樣反而會使問題變複雜)
#include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 10;char num[101][10]; int cmp(const void *a, const void *b) { char ab[2*N], ba[2*N]; char *temp_a = (char *)a; char *temp_b = (char *)b; strcpy(ab, temp_a); strcpy(ba, temp_b); strcat(ab, temp_b); strcat(ba, temp_a); return strcmp(ab, ba);} int main() { int m, i; while(scanf("%d", &m) != EOF) { for(i = 0; i < m; i++) { scanf("%s", num[i]); } qsort(num, m, sizeof(char)*N, cmp); for(i = 0; i < m; i++) { printf("%s", num[i]); } putchar('\n'); } return 0;} /************************************************************** Problem: 1504 User: wusuopuBUPT Language: C Result: Accepted Time:100 ms Memory:920 kb****************************************************************/
參考:
http://www.xuebuyuan.com/1531005.html
http://blog.csdn.net/zhu_liangwei/article/details/10857931