【剑指offer】设置在最小数目的阵列
转载请注明出处:http://blog.csdn.net/ns_code/article/details/28128551
- 题目描写叙述:
输入一个正整数数组,把数组里全部数字拼接起来排成一个数。打印能拼接出的全部数字中最小的一个。
比如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入:
输入可能包括多个測试例子。
对于每一个測试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,当中每一个正整数不超过10000000。
- 输出:
相应每一个測试案例,
输出m个数字能排成的最小数字。
- 例子输入:
3 23 13 6 2 23456 56
- 例子输出:
13236 2345656
AC代码例如以下:
#include<stdio.h> #include<stdlib.h> #include<string.h> char strs[100][10]; /* 自己定义比較规则 */ int mycompare(const void *str1,const void *str2) { static char s1[20]; static char s2[20]; char *string1 = (char *)str1; char *string2 = (char *)str2; //将两个字符串合并在一起 sprintf(s1,"%s%s",string1,string2); sprintf(s2,"%s%s",string2,string1); return strcmp(s1,s2); } /* 以字符串形式打印出最小的整数 */ void PrintMinNum(int *nums,int len) { if(nums==NULL || len<1) return; int i; //将整数写入到字符串中 for(i=0;i<len;i++) sprintf(strs[i],"%d",nums[i]); //依照mycompare中指定的规则排序 qsort(strs,len,10*sizeof(char),mycompare); for(i=0;i<len;i++) printf("%s",strs[i]); printf("\n"); } int main() { int nums[100]; int m; while(scanf("%d",&m) != EOF) { int i; for(i=0;i<m;i++) scanf("%d",nums+i); PrintMinNum(nums,m); } return 0; }
/**************************************************************
Problem: 1504
User: mmc_maodun
Language: C++
Result: Accepted
Time:240 ms
Memory:1020 kb
****************************************************************/