PAT乙級1023

1023 組個最小數 (20分)

題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805298269634560ios

給定數字 0-9 各若干個。你能夠以任意順序排列這些數字,但必須所有使用。目標是使得最後獲得的數儘量小(注意 0 不能作首位)。例如:給定兩個 0,兩個 1,三個 5,一個 8,咱們獲得的最小的數就是 10015558。數組

現給定數字,請編寫程序輸出可以組成的最小的數。spa

輸入格式:

輸入在一行中給出 10 個非負整數,順序表示咱們擁有數字 0、數字 一、……數字 9 的個數。整數間用一個空格分隔。10 個數字的總個數不超過 50,且至少擁有 1 個非 0 的數字。code

輸出格式:

在一行中輸出可以組成的最小的數。ci

輸入樣例

2 2 0 0 0 3 0 0 1 0

輸出樣例

10015558

個人理解

輸入數據的值表示對應數字的個數,要組成最小的數字,則需保證較小的數字在高位便可。可是要處理0這個特殊數字——不能在首位。若是有數字0,則首位變爲除了0以外第一個數字個數不爲0的數字,取出一位放到首位,並將這個除了0以外第一個數字個數不爲0的數字的個數減去一個。剩下的遍歷輸出便可。輸出時注意輸出的數字,而不是數字的個數。即數組的下標,而非數組值,數組值表示這個數字有多少個。可貴的一遍AC、、、get

代碼段

#include <iostream>
using namespace std;
// 找到輸出數字的第一個數字是哪一個,
int findFirstNumber(short array[]);
int main() {
    // 表示0-9的個數
    short array[10];
    int i = 0;
    while (i < 10) {
        cin >> array[i++];
    }
    // 若是數字0的個數爲0
    if (array[0] == 0) {
        for (int i = 1; i < 10; i++) {
            if (array[i] != 0) {
                for (int j = 0; j < array[i]; j++) {
                    cout << i;
                }
            }
        }
    } else {
        int firstNumber = findFirstNumber(array);
        cout << firstNumber;
        array[firstNumber]--;
        for (int i = 0; i < 10; i++) {
            if (array[i] != 0) {
                for (int j = 0; j < array[i]; j++) {
                    cout << i;
                }
            }
        }
    }
    cout << endl;
    return 0;
}

int findFirstNumber(short array[]) {
    // 題目已經保證至少存在一個非0的數字
    for (int i = 1; i < 10; i++) {
        if (array[i] != 0) {
            return i;
        }
    }
}

更改過程

  1. 在輸出的過程當中,混淆了數字和數字個數,寫成了 cout << array[i] ,應該是cout << i
相關文章
相關標籤/搜索