1. 程式人生 > >PAT(Basic Level) Practice——1002 寫出這個數

PAT(Basic Level) Practice——1002 寫出這個數

原題目:

讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。

輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10^100^。

輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1 空格,但一行中最後一個拼音數字後沒有空格。

輸入樣例:

1234567890987654321123456789

輸出樣例:

yi san wu

 分析:

  1.  對於最大為10的100次方的大數,普通的方式不好儲存,我們採用字串儲存。【gets(ch);】
  2. 由於字符采用ASC II 碼值的儲存方式,每位數字字元減去字元0的ASC II 碼值即可即可得到每位的數值,再求和即可求得各位數字之和。
  3. 輸入之數每位數字最大之和不超過900,故可以省力直接將和的百十個位直接分解,若其他題目可能出現較大數,可採用陣列儲存每位的數。
  4. 對於百位和十位有可能出現0的情況進行討論,個位則可以直接在最後列印
百位十位分情況討論
百位 十位 處理
為0 為0 無操作
為0 非0 列印十位
非0 為0 依次列印百位十位
非0 非0 依次列印百位十位

 

      5.每個數字的中文儲存成字串陣列,最後直接呼叫列印,注意每個中文數字後有空格,但最後一個沒有。

程式碼:

C語言版:

#include <stdio.h>
#include <string.h>
int main()
{
    //用於儲存輸入的數,直接存為字串
    char ch[101];
    //將中文數字直接儲存為字串陣列,需要時直接使用,從0開始到9,方便呼叫,因為陣列下標從0開始
    char Num[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
    int i,j,k,p=0;
    gets(ch);
    for(i=0;i<strlen(ch);i++)
    {
        //將字串中的每一位減去字元'0'的ASC ii碼值,即可得到每一位的大小,並與之前的數求和儲存
        p+=ch[i]-'0';
    }
    //直接分解,百位為i,十位為j,個位為k,也可以採用陣列儲存
    i=p/100;
    j=(p/10)%10;
    k=p%10;
    //分情況處理,列印結果
    if(i==0&&j==0)
    {
        //
    }
    else if(i==0&&j!=0)
    {
        printf("%s ",Num[j]);
    }
    else
    {
        printf("%s ",Num[i]);
        printf("%s ",Num[j]);
    }
    printf("%s",Num[k]);
    return 0;
}