PAT 乙級 1023.組個最小數 C++/Java

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

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

輸入格式:

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

輸出格式:

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

輸入樣例:

2 2 0 0 0 3 0 0 1 0

輸出樣例:

10015558

思路1:

用一個數組保存10個非負整數的個數,根據各個非負整數出現的次數,把他們轉化成字符,push進一個字符串的尾部spa

假設有字符串s,給出2個0,就將2個0轉化成字符,添加到s的尾部, s.push_back(0+48) 執行2次code

字符 c = '1', 將char轉成int:int a = c - 48blog

整型 a = 1,將int轉成char: char c = a + 48ci

最後遍歷字符串,若是第一位是0,就將第一位非0字符與第一位進行交換字符串

思路2:

用一個數組保存10個非負整數的個數get

從1-9中選一個最小的數輸出1次,其個數-1

而後從0開始依次輸出數組

C++實現

思路1

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <string>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     const int N = 10;
 9     int arr[N];
10     string s;
11     for (int i = 0; i < N; ++i)
12     {
13         cin >> arr[i];
14         for (int j = 0; j < arr[i]; ++j)
15         {
16             s.push_back((i + 48));
17         }
18         
19     }
20     sort(s.begin(), s.end());
21     if (s.at(0) == '0')
22     {
23         for (int i = 1; i < s.size(); ++i)
24         {
25             if (s[i] != '0')
26             {
27                 char temp = s[i];
28                 s[i] = s[0];
29                 s[0] = temp;
30                 break;
31             }
32         }
33     }
34     cout << s;
35     return 0;
36 }
View Code

思路2

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     const int N = 10;
 7     int arr[10];
 8     for (int i = 0; i < N; ++i)
 9     {
10         cin >> arr[i];
11     }
12 
13     for (int i = 1; i < N; ++i)
14     {
15         if (arr[i] != 0)
16         {
17             cout << i;
18             arr[i]--;
19             break;
20         }
21     }
22 
23     for (int i = 0; i < N; ++i)
24     {
25         for (int j = 0; j < arr[i]; ++j)
26         {
27             cout << i;
28         }
29     }
30     return 0;
31 }
View Code
相關文章
相關標籤/搜索