一.问题:
给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
二.思路:
具体看代码,思路如下图:
三.代码实现:
#include<stdio.h>
//根据指定次数p打印输出num
void print(int num,int p)
{
if(p==0)
{
return;
}
for(int i = 0;i < p;i++)
{
printf("%d",num);
}
}
int main()
{
//输入数据
int num_arr[10] = {0};
scanf("%d %d %d %d %d %d %d %d %d %d",&num_arr[0],&num_arr[1],&num_arr[2],&num_arr[3],&num_arr[4],&num_arr[5],&num_arr[6],&num_arr[7],&num_arr[8],&num_arr[9]);
//检查数字一的个数是否为0
//1.1有1
if(num_arr[1] != 0)
{
//1.2输出一个1
print(1,1);
//1.3输出所有0
print(0,num_arr[0]);
//1.4输出剩余1
print(1,num_arr[1]-1);
//1.4依次输出后面的每种数字的个数
for(int i = 2;i< 10;i++)
{
print(i,num_arr[i]);
}
}
//2.1没有1
else
{
//2.2找后面第一个个数不为0的最小数字,先打印一个
int t = 0;
for(int j = 2;j<10;j++)
{
//2.2.1先打印一个最小数字
if(num_arr[j] != 0)
{
print(j,1);
t = j;
break;
}
}
//2.3输出所有0
print(0,num_arr[0]);
//2.4依次输出第一个个数不为0的最小数字的剩余个数
print(t,num_arr[t]-1);
//2.5依次输出后面的每种数字的个数,但要先检查t是不是9
int x = t+1;
for(;x<10;x++)
{
if(x >= 10 || x <= -1)
{
break;
}
print(x,num_arr[x]);
}
}
putchar('\n');
return 0;
}