PAT Basic 1023 組個最小數

給定數字 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 不能放在第 1 位,所以如果每 1 位,先打一個除 0 以外最小的數,這個數的數量減 1,再打出剩余所有數。

?

代碼

#include <stdio.h>

int main()
{
    int a[10] = {0};
    for(int i = 0; i < 10; i++) scanf("%d", &a[i]);
    // 處理前面的 0 
    if(a[0])
    {
        for(int i = 1; i < 10; i++)
            if(a[i]){
                printf("%d", i);
                a[i]--;
                break;
            }
    }

    for(int i = 0; i < 10; i++)
    {
        while(a[i]--) {printf("%d", i);}
    }

    return 0;
}
改進

看了別人寫的代碼以后,發現我對oj系統有一定的誤解,我每次都是一次性輸完,然后將數存儲在數組或其他結構中,然后再做運算。
其實可以一邊輸入,一邊計算的,如果對結果沒有影響的話。

#include <stdio.h>

int main()
{
    // 設置一個數來記錄 0 的數量  
    int zero = 0, notzero = 0;
    scanf("%d", &zero);
    for(int i = 1; i <= 10; i++)
    {
        scanf("%d", &notzero);
        while(notzero--)
        {
            putchar('0' + i);
            while(zero-- > 0) putchar('0');
        }
    }
    return 0;
}

// 先輸出一個除0的數,再把所有的 0 都輸出
// 然后再輸出剩下的數
注意點

檢測zero的時候本來是這樣寫的:

while(notzero--)
        {
            putchar('0' + i);
            while(zero) putchar('0');
        }

但是發現會出現死循環,然后這樣檢測一下:

#include <stdio.h>

int main()
{
    int zero = 0, notzero = 0;
    scanf("%d", &zero);
    int j = 0;
    for(int i = 1; i <= 10; i++)
    {
        scanf("%d", &notzero);
        while(notzero--)
        {
            putchar('0' + i);
            while(zero-- > -10) 
            {
                printf("zero = %d\n", zero);
                putchar('0');
             }
        }
    }
    return 0;
}

輸出結果:

2 2 0 0 0 3 0 0 1 0
1zero = 1
0zero = 0
0zero = -1
0zero = -2
0zero = -3
0zero = -4
0zero = -5
0zero = -6
0zero = -7
0zero = -8
0zero = -9
0zero = -10
015558

如果僅僅是檢測zero是否為 0 ,zero在下一個循環還會繼續循環下去。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容