7-23 幣值轉換(20 分)
輸入一個整數(位數不超過9位)代表一個人民幣值(單位為元),請轉換成財務要求的大寫中文格式。如23108元,轉換后變成“貳萬叄仟壹百零捌”元。為了簡化輸出,用小寫英文字母a-j順序代表大寫數字0-9,用S、B、Q、W、Y分別代表拾、百、仟、萬、億。於是23108元應被轉換輸出為“cWdQbBai”元。
輸入格式:
輸入在一行中給出一個不超過9位的非負整數。
輸出格式:
在一行中輸出轉換后的結果。注意“零”的用法必須符合中文習慣。
輸入樣例1:
813227345
輸出樣例1:
iYbQdBcScWhQdBeSf
輸入樣例2:
6900
輸出樣例2:gQjB
思路:輸出的時候采用整形數字來輸入,防止前導零
(雖然好像沒有這個測試點),考慮輸入最小數字零,中間正常零
,以上都不是事。重點是不超過億,中間連續多個零這個測試點,我看了好幾個AC代碼的帖子,有一億零一輸出一億零零一
、然后還有第五位不管是不是零,萬必須輸出的。我都試了,然而沒軟用。調試到腦疼,看來我還是too young too naive。
1 #include<stdio.h> 2 #include<string> 3 #include<sstream> 4 #include<iostream> 5 using namespace std; 6 int main() 7 { 8 string money; 9 cin >> money; 10 11 int numb = atoi(money.c_str()); 12 if (numb == 0) { //特殊值為零的時候 13 cout << "a" << endl; return 0; 14 } 15 stringstream ss; //取消前導零 16 ss << numb; 17 ss >> money; 18 string mcopy = money; 19 int len = money.length(); 20 21 for (int i = 0; i < money.length(); i++) 22 { 23 if (atoi(money.c_str()) == 0) break; //取消后導零 24 25 switch (money[i]) 26 { 27 case '0':if (mcopy[i - 1] != money[i] && i != 0)cout << "a";break; 28 case '1':cout << "b"; break; 29 case '2':cout << "c"; break; 30 case '3':cout << "d"; break; 31 case '4':cout << "e"; break; 32 case '5':cout << "f"; break; 33 case '6':cout << "g"; break; 34 case '7':cout << "h"; break; 35 case '8':cout << "i"; break; 36 case '9':cout << "j"; break; 37 } 38 39 if (money[i] == '0') { //第五位萬一定要輸出????? 40 41 if (len == 5 && atoi(mcopy.c_str())<100000000)cout << "W"; 42 len--; continue; 43 } 44 money[i] = '0'; 45 switch (len) 46 { 47 case 2:cout << "S"; break; 48 case 3:cout << "B"; break; 49 case 4:cout << "Q"; break; 50 case 5:cout << "W"; break; 51 case 6:cout << "S"; break; 52 case 7:cout << "B"; break; 53 case 8:cout << "Q"; break; 54 case 9:cout << "Y"; break; 55 56 } 57 len--; 58 } 59 cout << endl; 60 return 0; 61 }
既然看了帖子還是要有正確答案的
http://makaidong.com/andywenzhi/2101_3682628.html