1. 程式人生 > 其它 >pat刷題1002

pat刷題1002

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

輸入格式:

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

輸出格式:

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

輸入樣例:

1234567890987654321123456789
結尾無空行

輸出樣例:

yi san wu
結尾無空行 自己寫的程式碼:
#include<stdio.h>
int main()
{
    int n[100]={0};

    int a=0; //各個數的和 
    int count=0
;//記錄陣列的個數 int m,i,f,j=0; for(i=0;i<100;i++) //迴圈輸入陣列資料 { scanf("%d",&m); char c=getchar();//getchar函式,從鍵盤的緩衝區中得到一個字元常量並賦值給c n[i]=m; count++; if(c=='\n') //當鍵盤輸入回車時結束輸入輸入 { break; } } for(i=0;i<count;i++) { printf(
"%d",n[i]); } // printf("\n"); for(i=0;i<count;i++){ a=a+n[i]; } printf("%d",a); printf("\n"); int b=0;//記錄a的倒置數 while(a>0){ b=b*10+(a%10); a=a/10; } printf("%d",b); printf("\n"); int sum=0; while(b>0
){ switch(b%10){ case 0:printf("ling");break; case 1:printf("yi");break; case 2:printf("er");break; case 3:printf("san");break; case 4:printf("si");break; case 5:printf("wu");break; case 6:printf("liu");break; case 7:printf("qi");break; case 8:printf("ba");break; case 9:printf("jiu");break; } b=b/10; if(sum<b) printf(" "); } return 0; }

錯誤的,主要是輸入的問題,無法想題目一樣讀入123456789098765432123456789這麼大的數,一開始用的是long long資料型別儲存,但測試資料超過了最大值。然後用陣列儲存數值,但輸入形式又不對,我寫的程式碼需要在每個數字之間加空格才可以儲存進陣列中。

於是:去找了答案,如下:

#include <stdio.h>
#include <string.h>

int main() {
    const char pinyin[10][5] = {"ling", "yi", "er", "san", "si",
                            "wu", "liu", "qi", "ba", "jiu"};
    int num, sum = 0; 
    while(scanf("%1d", &num) != EOF)
        sum += num;
    char ans[4]; //給出的數 < 10^100,故各位數字之和最多為900  
    sprintf(ans, "%d", sum);
    for(int i = 0; i < strlen(ans); i++) {
        if(i != 0)
            printf(" ");
        printf("%s", pinyin[ans[i] - '0']);//‘0’-‘0’=0,0-‘0’=-48
    }
    return 0;
}

分析:

1. while(scanf("%1d", &num) != EOF)

在我們進行包括scanf等的輸入函式使用時,其實使用者在cmd中的輸入實際是存放於緩衝區當中,當用戶鍵入回車那一瞬間,之前輸入的資料才會被存進去,而這裡無論是單個字元還是字串,我們都知道scanf的返回值呢是表示成功接受到的物件的個數,那這裡如果遇到特殊情況,比如緩衝區檔案流滿等問題,那麼scanf將如何處理呢?答案是返回-1 ! 這裡不光是scanf,返回值為個數的函式,遇到檔案流滿大多都會返回-1,所以這個-1用的比較多,那麼stdio.h就索性專門定義一個巨集來表示,取End Of File(檔案末尾的意思)的前三個字母即組成EOF,所以也就有了 #define EOF (-1) 這樣的話!

2.標頭檔案:#include <stdio.h>

sprintf()函式用於將格式化的資料寫入字串,其原型為:
int sprintf(char *str, char * format [, argument, ...]);

【引數】str為要寫入的字串;format為格式化字串,與printf()函式相同;argument為變數。

3.

pinyin[ans[i] - '0']
我自己擺弄了一些發現
用%d輸出的話
‘0’-‘0’=0,0-‘0’=-48,‘1’-‘0’=1,1-‘0’=-47