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
结尾无空行
思路:特别注意,输入的是数字0~数字9的个数,而不是本身,于是,可以得到第一个先天条件-------输入格式已经从小到大排序好了,下标就是数字0到数字9本身,元素就是个数。
输出格式要求第一个数不能为零,那我们可以从第二个位数开始处理,但此时必须要考虑第二个位数也为零的情况,以此类推,于是我们先使用一个循环,找到从第二位数开始以后位数中,第一个不为零的位数。
当找到这个位数后,提取这个位数的下标,代表数字几,同时提取后,要将该位数的元素减一(str(int - 1),原因是我们已经提取了这个位数的一个数字,而又由于该位数大于等于一,于是不会报错。
在输出时,建立循环,我们先将这个提取的数字输出,后面再依次打印str下标乘以int位数,代表该位数上有多少个重复数字。
注意:若要将该元素复制,格式为:str * int,str代表需要复制的元素,int代表复制次数,复制后的元素会直接“粘贴”在一起。
numbers_input = input().split()#输入
for i in range(1,10):#从第二位开始
if numbers_input[i] != '0':
#提取该位数
ret = str(i)
#该位数上的元素减一
numbers_input[i] = str(int(numbers_input[i]) - 1)
break#记得完成一次后立刻结束
for i in range(0,10):
#ret为提取的元素,后面是复制次数
ret = ret + str(i) * int(numbers_input[i])
print(ret)