给定数字 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
题意理解:
让你输入十个数字,该10个数字表示每个数字出现的次数。而不是用这十个数字组成最小数。
例如:2 2 0 0 0 3 0 0 1 0
表示 数字“0”出现两次,数字“1”出现 2次,数字“5”出现3次,以此类推。
而不是用上述数字组成 最小数: 1000000223
思路:
用arr[10]存储每个数字出现的个数。
1.由于数组下标是递增的,所以我们找到第一个非零的下标,就是表示第一位数字。直接输出1个。后面再输出arr[0]个"0".
2. 如果第一个非零数个数>1,那么在零之后紧接着输出所有的最小非零
3. 按数组下标顺序输出其他数字。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int arr[10]={
0};
//输入部分:输入十个数字
for(int i=0;i<10;i++)
{
cin>>arr[i];
}
//逻辑处理部分
//找到最小非零整数 ,输出该数,作为第一位
for(int i=1;i<10;i++)
{
if(arr[i]>0)
{
cout<<i;
arr[i]--; //我们首先要输出第一位非零数字,所以只需count-1,后面还要继续输出该数。
break;
}
}
for(int i=0;i<arr[0];i++)
{
cout<<"0";
}
for(int i=1;i<10;i++) //控制下标位置
{
for(int j=0;j<arr[i];j++) //每一下标对应的控制输出个数
{
if(arr[i]!=0)
{
cout<<i;
}
}
}
}
结果: