1023 組個最小數 (20分)
題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805298269634560
給定數字 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這個特殊數字——不能在首位,如果有數字0,則首位變為除了0之外第一個數字個數不為0的數字,取出一位放到首位,并將這個除了0之外第一個數字個數不為0的數字的個數減去一個,剩下的遍歷輸出即可,輸出時注意輸出的數字,而不是數字的個數,即陣列的下標,而非陣列值,陣列值表示這個數字有多少個,難得的一遍AC、、、
代碼段
#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;
}
}
}
更改程序
- 在輸出的程序中,混淆了數字和數字個數,寫成了
cout << array[i],應該是cout << i,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/98384.html
標籤:其他
