PAT 乙:1023 组个最小数 (20 分)

给定数字 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;
			} 
		}
	}
}

结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SKMIT/article/details/113789029