码迷,mamicode.com
首页 > 其他好文 > 详细

趣味PAT--循环-19. 币值转换(20)

时间:2015-06-10 12:05:02      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:

  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代码

技术分享
#include <iostream>

int main()
{
    int     a[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
    int     b[] = {a, b, c, d, e, f, g, h, i, j};
    int     c[] = { , S, B, Q, W, S, B, Q, Y};
    int     d[10] = { 0 };
    int     n, k = 0;
    char    out[20] = { 0 };
    //last用来标记上一位是否为0,first用来标记亿位到万位之间是否全为0    
    int     last = 0, first = 1;
    
    std::cin >> n;
    //用字符数组来保存输入就可以避免使用除法,但是那样可能不太直观 
    for (int i = 8; i >= 0; i--)
        d[i] = n / a[i] % 10;

    for (int i = 8; i >= 0; i--)
    {
        //验证亿位到万位之间是否全为0 
        if (i <= 7 && i >= 4 && d[i] != 0) {
            first = 0;
        }
        
        if (d[i] != 0) {
            out[k++] = b[d[i]];
            //个位上没有单位 
            if (i != 0)
                out[k++] = c[i];
            last = d[i];
        } else if (last != 0 && i != 4) {
            //这个位是0但上一个位不是0并且这个位不是万位,如 200 的十位 
            out[k++] = b[d[i]];
            last = d[i];
        } else if ((i == 4) && first == 0) {
            //万位为0并且在万位之前亿位之后已经有非0位,如 100505000 
            if (out[k-1] == b[0]) {
                //十万位为0,则去掉十万位的0,如 105005000 
                out[k-1] = c[i];
            } else {
                //十万位非0,如 100555000 
                out[k++] = c[i];
            }
            last = 1;
        }
    }
    
    //输入为0 
    if (n == 0) {
        out[k++] = b[0];
    }
    
    //如果个位是0,则要清除输出结果中的0,如 200 
    if (out[k-1] == b[0] && k != 1) {
        out[k-1] = \0;
    } else {
        out[k] = \0;
    }
    
    std::cout << out;

    return 0;
}
View Code

总结:这道题看似简单,但是其中有一些细节还是挺绕人的,非常考察对细节的处理能力,所以写出来记录一下,以后也会特别注意类似的问题

趣味PAT--循环-19. 币值转换(20)

标签:

原文地址:http://www.cnblogs.com/autyinjing/p/4565355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!