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

#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;
}

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

时间: 2024-08-02 01:42:18

趣味PAT--循环-19. 币值转换(20)的相关文章

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

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成"贰万叁仟壹百零捌"元.为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S.B.Q.W.Y分别代表拾.百.仟.万.亿.于是23108元应被转换输出为"cWdQbBai"元. 输入格式: 输入在一行中给出一个不超过9位的非负整数. 输出格式: 在一行中输出转换后的结果.注意"零"的用法必须符合中文习惯. 输入样例1: 8

循环-19. 币值转换

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成“贰万叁仟壹百零捌”元.为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S.B.Q.W.Y分别代表拾.百.仟.万.亿.于是23108元应被转换输出为“cWdQbBai”元. 输入格式: 输入在一行中给出一个不超过9位的非负整数. 输出格式: 在一行中输出转换后的结果.注意“零”的用法必须符合中文习惯. 输入样例1: 813227345 输出样例1: iYbQdBcSc

-PAT-java-5-23 币值转换 (20分)

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成"贰万叁仟壹百零捌"元.为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S.B.Q.W.Y分别代表拾.百.仟.万.亿.于是23108元应被转换输出为"cWdQbBai"元. 输入格式: 输入在一行中给出一个不超过9位的非负整数. 输出格式: 在一行中输出转换后的结果.注意"零"的用法必须符合中文习惯. 输入样例1: 8

cisco-router-nat/pat网络/端口地址转换

(以下所有内容为本手纯手打,有纰漏的地方,也请大家多多包含可发小猪消息赐教交流!) (本文所有内容及批注呈内收递归的架构显示,因格式显示不懂之处望谅解!) (本文手打之,命令关键字大多使用简写,如有不明最好是键入命令时惯用tab补全!) 网络地址转转nat(static静态转换/dynamic动态转换).端口多路复用pat: 1.静态nat的配置: router(config)#int f0/0 router(config-if)#ip add 10.0.0.1 255.255.255.0 (设

7-23 币值转换

7-23 币值转换(20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成"贰万叁仟壹百零捌"元.为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S.B.Q.W.Y分别代表拾.百.仟.万.亿.于是23108元应被转换输出为"cWdQbBai"元. 输入格式: 输入在一行中给出一个不超过9位的非负整数. 输出格式: 在一行中输出转换后的结果.注意"零"的用法必须

PAT乙级1034. 有理数四则运算(20)

本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分:若为负数,则须加括号:若除法分母为0,则输出“Inf”.题目保证正确的输出中没

4.6日第10次作业,,18章风险,19章收尾,20章知识产权,高项,29-田哲琦

4.6日第10次作业,,18章风险,19章收尾,20章知识产权,高项,29-田哲琦 第18章.风险管理 1.风险管理包括哪六个过程?(记)P456 答:1).风险管理规划: 2).风险识别: 3).定性风险分析: 4).定量风险分析: 5).应对计划编制: 6).风险监控: 2.什么是应急计划?请举例.P459 答:应急计划:是指当一项可能的风险事件实际发生时项目团队将采取的预先确定的措施: 例如:当项目经理根据一个新的软件产品开发的实际进展情况,预计到该软件开发成果奖不能及时集成到正在按合同进

币值转换

7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成"贰万叁仟壹百零捌"元.为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S.B.Q.W.Y分别代表拾.百.仟.万.亿.于是23108元应被转换输出为"cWdQbBai"元. 输入格式: 输入在一行中给出一个不超过9位的非负整数. 输出格式: 在一行中输出转换后的结果.注意"零"的用法必须

寒假二:币值转换

7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成"贰万叁仟壹百零捌"元.为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S.B.Q.W.Y分别代表拾.百.仟.万.亿.于是23108元应被转换输出为"cWdQbBai"元. 输入格式: 输入在一行中给出一个不超过9位的非负整数. 输出格式: 在一行中输出转换后的结果.注意"零"的用法必须