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