天天看點

C語言解法思路,PTA乙級1002【寫出這個數】思路及代碼(C語言/補充cpp及python解法)...

題目

C語言解法思路,PTA乙級1002【寫出這個數】思路及代碼(C語言/補充cpp及python解法)...

基本思路

相信大家能找到這個部落格肯定都是有對這道題經過一定思考之後再搜尋的,想分享一下一個計算機系大二學渣的基本思路,目前我們還沒有學【資料結構】之類的專業課,和其他大佬們比起來我唯一的優勢或許就是能夠解釋的比較通俗易懂啦。其實開部落格的,目的也就隻是想要記錄一下自己解這些題目的時候的思維,友善日後查漏補缺和更新。

以下是我的剖析:

首先是輸入要求,是一個自然數,且不超過101位,有一定基礎的同學肯定就已經知道了這個數過大超過了int、long之類的範圍,隻能通過char來定義了(非常慚愧的表示我好像java學的比c好一點,最近才開始補c可能廢話會比較多)

輸入問題解決了之後我們就要開始想下一步,也就是如何把這一串字元單個還原成int類型進行加運算。這裡我搜了兩個方法。一個是使用指針,btw這個不熟,我們用更簡單的方法,直接ASCII碼轉換,用字元1減去48或者減去‘0’,這樣我們就能得到整型的1

每一位數相加用for循環周遊 這個很簡單就不多提

最後是輸出拼音數字的問題,最開始我想用switch來實作,但是那樣的話代碼就太長了看着非常不清晰,最後我選擇了定義一個字元串數組去存儲我要輸出的那十個數字拼音。(說來好笑,我還是算了一遍确定了無論如何之前求得的數字和都不會多過三位數才放心用if去做輸出的。)

###其他一些瑣碎的東西###

最開始輸出我用了switch嘛,其實非要用也可以的,定義一個函數也是很簡單的。但關鍵是–最開始我完全沒有想過用函數,記錄一下最開始這個輸出的傻代碼。

switch(i/100)

{

case 0: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;

}

if(i/100==0)

{

switch(i/10)

{

case 0: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;

}

}else{switch(i/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;

}

}

if(i/10!=0){

switch(i%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;

}

}else{

switch(i%10)

{

case 0: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;

}

}

對,如果你有耐心看就會發現…我把空格都直接在輸出那兒控制住了。因為發現如果是個兩位數的話我還用i/100求整也就算了,但是那樣就會導緻比如23輸出ling er san,這就很尴尬了,答案必然報錯。是以就有了之前這麼一大串很繁瑣的if來區分最後和的位數。還好最後想到了其他方法,數組真好用!(我的代碼真的很醜了那個時候還沒看《代碼整潔之道》,嗚嗚嗚弟弟代碼)

最終代碼

C語言解法思路,PTA乙級1002【寫出這個數】思路及代碼(C語言/補充cpp及python解法)...

#include

int main() {

char n[100];//定義一個數組,開空間友善大數輸入

int j, i = 0;

scanf("%s", &n);//字元串輸入要用%s

for( ;n[i] != '\0'; i++) {

j += (n[i]-'0'); //類型轉換

}

char pin[10][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

if(j > 99) {

printf("%s ", pin[j/100]);

printf("%s ", pin[j%100/10]);

printf("%s", pin[j%100%10]);

}else if(j > 9) {

printf("%s ", pin[j/10]);

printf("%s", pin[j%10]);

}else{

printf("%s", pin[j]);

}

return 0;

}

一些我知道的不足之處

就是最後定義拼音字元串的時候我完全不知道為什麼要定義成二維的

(習慣了Java直接把字元串輸入進去…)

(好啦我知道這些都不是我懶惰的借口)

粗略搜了一下改成這樣的—char[10][10],之後有機會把書看完我會回來改的。

有時間二刷的話我會用Java和C++還有c#嘗試一遍的。

2020更新一下

知道為啥用二維數組了,早就知道了…忘記這裡還有個坑沒有填了。C因為沒有字元串類型,是以每次需要使用到字元串的情況就需要char數組,但大家都知道char是單個字元,而我們如果是一個字元串就相當于一個一維的字元數組,此時字元數組的長度就是字元串的長度,而多個字元串就意味着多了一個“一維數組”但這個數組裡儲存的是字元串,是以集合成了字元二維數組。該二維數組行定義的時候就表示字元串的個數(适當加大點容量,防止有可能發生的段錯誤),列是字元串的長度。

2019.7.27

補充C++解法

to_string()是C11特性,如果需要在Dev裡編譯需要在tool編譯器選項裡加入【-std=c++11]

#include

#include

using namespace std;

int main() {

int sum = 0;

string s;

cin >> s;

string piny[] = { "ling", "yi", "er", "san", "si", "wu", "liu","qi","ba","jiu"};

for (int i = 0; i < s.size(); i++)

sum += stoi(s.substr(i, 1));

string num = to_string(sum);

for (int i = 0; i < num.size(); i++) {

if(i != 0) cout << " ";

cout << piny[num[i] - '0'];

}

return 0;

}

C語言解法思路,PTA乙級1002【寫出這個數】思路及代碼(C語言/補充cpp及python解法)...

補充Python解法

n = input()

cnt = 0

for i in n:

cnt = cnt + int(i)

temp = ['ling', 'yi', 'er', 'san', 'si', 'wu', 'liu', 'qi', 'ba', 'jiu']

res = str(cnt)

for i in res[:-1]:

print(temp[int(i)], end = ' ')

print(temp[int(res[-1])])

C語言解法思路,PTA乙級1002【寫出這個數】思路及代碼(C語言/補充cpp及python解法)...