【剑指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****************************************************************/
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号