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