给定数字 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;
②方便输出所以我们需要用string作为最后的输出
③这道题目最好的思路就是手算模拟:首先我们判断我们这些数字里面有没有0,如果没有0那很好,我们只需要将从小到大挨个输出每一个数字即可;如果有0那就会稍微麻烦一些,我们首先找到除0之外最小的数字,我们要拿出这个最小的其中一个(只需要1个)放在开头,后面跟所有的0,然后我们在输出这个最小数剩余多少个输出,处理好这些之后,我们就可以当做没有0了,然后就从小到大挨个输出就行了。
我们举个例子:2 2 0 0 0 3 0 0 1 0:
那也就是说我们有2个‘0’,2个‘1’,3个‘5’,1个‘8’。那这就是我们上面说的有0的情况了。我们首先找出除了0之外最小的数是‘1’,那我们就需要拿出其中一个‘1’放在开头,然后后面接所有数量的‘0’,就像这样"100",做完这些后,我们还剩1个'1'以及后面的3个‘5’,1个‘8’,那我们就按照从小到大挨个输出就行啦。最后变成了"1005558"。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
int num;
string mini = "";
vector<int> a[10];
for (int i = 0; i < 10; i++) { //传入数组
cin >> num;
for (int j = 0; j < num; j++) {
a[i].push_back(i);
}
}
if (a[0].size() == 0) { //如果没有0
for (int i = 1; i < 10; i++) {
if (a[i].size() == 0) {
continue;
}
else {
while (a[i].size()) {
int s = a[i].back() + '0'; //找出最后的元素
a[i].pop_back(); //拿出数组
mini.push_back(s);
}
}
}
}
else { //如果有0,但是开头的数字不能是0
bool tiao_jian = true; //为了让条件判断只执行一次而设置的变量
for (int i = 1; i < 10; i++) {
if (a[i].size() == 0) {
continue;
}
else if (a[i].size() != 0 && tiao_jian == true) { //找到除了0最小的,拿出一个
tiao_jian = false;
int s = a[i].back() +'0'; //拿出这里面的一个数字,后面接0的所有
a[i].pop_back(); //拿出数组
mini.push_back(s);
while (a[0].size()) {
int n = a[0].back() + '0';
a[0].pop_back();
mini.push_back(n);
}
while (a[i].size()) {
int m = a[i].back() + '0'; //找出最后的元素
a[i].pop_back(); //拿出数组
mini.push_back(m);
}
}
else {
while (a[i].size()) {
int s = a[i].back() + '0'; //找出最后的元素
a[i].pop_back(); //拿出数组
mini.push_back(s);
}
}
}
}
cout << mini << endl;
return 0;
}
首先我们进行定义与输入: int num;就是我们要输入0~9的数量,string mini = "";这个就是存储我们最后要输出的值,vector<int> a[10];这个就是我们根据上面输入的数量放多少个具体的数比如’0‘有3个那么a[0]里面就放3个0。
接着我们利用for循环进行输入,以及用a[i].push_back(i);传入vector容器里面。
然后我们就进行情况判定,
首先就是没有0的情况,那么我们就从小到大依次从vector里面拿出来就行了。int s = a[i].back() + '0'; a[i].pop_back();这两句话是固定搭配,首先找到a[i]的最后一个元素(其实每个a[i]里面元素都是一样的)然后将他转换成字符形式。a[i].pop_back()是为了将a[i].size()值减1。
然后是有0的情况:首先我们定义一个bool tiao_jian = true;这是为了让我们的else if中语句只执行一次,后面就不再进行else if了。这有0的情况和没有0的情况就相差在else if语句上面,那我就来解释一下else if干了什么:为了实现只执行一次,我们在里面将tiao_jian设置为false;接下来我们找到除0之外最小的数字,我们要拿出这个最小的其中一个(只需要1个)放在开头,后面跟所有的0(else if中第一个while干这事),然后我们在输出这个最小数剩余 (else if中第二个while干这事),处理好这些之后,我们就可以当做没有0了,然后就从小到大挨个输出就行了。