题目:组个最小数
给定数字 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
解题思路:
在本题目中由于他是按0~9的顺序存储,所以不需要对其给定的数进行排序,直接以0~9为数组下标,将其个数存储在对应的单元中即可,在得到最终的数值的时候需要考虑两种情况:①不存在数字0,这时可以直接利用两层循环就可以得到这个数值,内层循环是将B[i]个i存入到A中,外层循环是从1~9开始检索有没有这个数字;②存在数字0,这时需要检索第一个非0的数字,并将其放入到最终数值的第一位上,并将其B[i]-1,表示其后续出现次数需要-1,后面则和①的方式一致,最终就可以得到想要的数值了。
代码:
#include<iostream>
using namespace std;
int main()
{
int A[51]; //用于存储最终的数
int B[11]; //用于表示每个数字含有的个数
int num = 0; //用于存储最终数的位数
bool yes = 0; //用于退出循环
//输入
for(int i=0;i<10;i++)
{
cin>>B[i];
}
//将数字装入最终数中
if(B[0] == 0) //表示不存在0(不用考虑0不可以位于第一位的情况)
{
for(int i=1;i<10;i++) //装入1~9的数字
{
for(int j=0;j<B[i];j++) //在这个循环中装入B[i]个i
{
A[num++] = i;
}
}
}
else //存在0的数字(需要考虑其第一位不能是0)
{
for(int i=1;i<10;i++) //装入第一位的数字
{
for(int j=0;j<B[i];j++) //在这个循环中装入B[i]个i
{
A[num++] = i;
B[i] = B[i] - 1;
yes = 1;
break; //补第一位过后退出循环
}
if(yes)
{
break;
}
}
for(int i=0;i<10;i++) //装入0~9的数字
{
for(int j=0;j<B[i];j++) //在这个循环中装入B[i]个i
{
A[num++] = i;
}
}
}
//输出
for(int i=0;i<num;i++)
{
cout<<A[i];
}
cout<<endl;
system("pause");
return 0;
}