趣味PAT--循环-19. 币值转换(20)
One visible minute on the stage is attributed to ten years of invisible practice off the stage.
"台上一分钟,台下十年功"
题目链接:循环-19. 币值转换(20)
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB
解题思路:hash映射,将a-j直接映射到字符数组的0-9号元素,将个位到亿位映射到字符数组的0-8号元素,将输入整数的每一位也映射到一个整型数组中,用作索引。然后从高位到低位顺序扫描输入的每一位,按照每一位转换为“数量+单位”的格式将结果保存在一个字符数组中,具体见下面的代码
注意点:多个连续0的情况,万位的处理,个位的处理,注意下面几个测试用例
①0; ②1; ③200; ④105005000; ⑤100505000; ⑥100055000;
AC代码:
1 #include <iostream> 2 3 int main() 4 { 5 int a[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000}; 6 int b[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}; 7 int c[] = {' ', 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'}; 8 int d[10] = { 0 }; 9 int n, k = 0; 10 char out[20] = { 0 }; 11 //last用来标记上一位是否为0,first用来标记亿位到万位之间是否全为0 12 int last = 0, first = 1; 13 14 std::cin >> n; 15 //用字符数组来保存输入就可以避免使用除法,但是那样可能不太直观 16 for (int i = 8; i >= 0; i--) 17 d[i] = n / a[i] % 10; 18 19 for (int i = 8; i >= 0; i--) 20 { 21 //验证亿位到万位之间是否全为0 22 if (i <= 7 && i >= 4 && d[i] != 0) { 23 first = 0; 24 } 25 26 if (d[i] != 0) { 27 out[k++] = b[d[i]]; 28 //个位上没有单位 29 if (i != 0) 30 out[k++] = c[i]; 31 last = d[i]; 32 } else if (last != 0 && i != 4) { 33 //这个位是0但上一个位不是0并且这个位不是万位,如 200 的十位 34 out[k++] = b[d[i]]; 35 last = d[i]; 36 } else if ((i == 4) && first == 0) { 37 //万位为0并且在万位之前亿位之后已经有非0位,如 100505000 38 if (out[k-1] == b[0]) { 39 //十万位或者百万位为0,则去掉该0,如 105005000 40 out[k-1] = c[i]; 41 } else { 42 //十万位非0,如 100555000 43 out[k++] = c[i]; 44 } 45 last = 1; 46 } 47 } 48 49 //输入为0 50 if (n == 0) { 51 out[k++] = b[0]; 52 } 53 54 //如果个位是0,则要清除输出结果中的0,如 200 55 if (out[k-1] == b[0] && k != 1) { 56 out[k-1] = '\0'; 57 } else { 58 out[k] = '\0'; 59 } 60 61 std::cout << out; 62 63 return 0; 64 }
总结:这道题看似简单,但是其中有一些细节还是挺绕人的,非常考察对细节的处理能力,所以写出来记录一下,以后也会特别注意类似的问题
本站所有文章,若无说明皆为原创,转载烦请注明转自: ———— http://www.cnblogs.com/autyinjing/ ———— 若发现叙述不清或者有误的,还烦请提出建议和意见!