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;

②方便输出所以我们需要用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了,然后就从小到大挨个输出就行了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值