[PTA]7-23 币值转换

Spring-_-Bear 的 CSDN 博客导航

输入一个整数(位数不超过 9 位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如 23108 元,转换后变成 “贰万叁仟壹百零捌” 元。为了简化输出,用小写英文字母 a-j 顺序代表大写数字 0-9,用 S、B、Q、W、Y 分别代表拾、百、仟、万、亿。于是 23108 元应被转换输出为 “cWdQbBai” 元。

输入格式:

输入在一行中给出一个不超过 9 位的非负整数。

输出格式:

在一行中输出转换后的结果。注意 “零” 的用法必须符合中文习惯。

输入样例1:

813227345

输出样例1:

iYbQdBcScWhQdBeSf

输入样例2:

6900

输出样例2:

gQjB

来源:

来源:PTA | 程序设计类实验辅助教学平台
链接:https://pintia.cn/problem-sets/14/exam/problems/803

提交:

在这里插入图片描述

题解:

#include <stdio.h>

int main() {
    int money;
    scanf("%d", &money);

    // 币值为 0 的情况特殊处理
    if (money == 0) {
        printf("a");
        return 0;
    }

    /*
     * 获取 money 的各位数字并依次存进 digits 数组中,
     * 如 money = 813227345 八亿一千三百二十二万七千三百四十五,则 digits[10] = {5, 4, 3, 7, 2, 2, 3, 1, 8}
     */
    int len = 0;
    int digits[9] = {0};
    while (money) {
        digits[len++] = money % 10;
        money /= 10;
    }

    /*
     * 币值单位:S、B、Q、W、Y 分别代表拾、百、仟、万、亿,
     * 巧妙设计其与 digits 数组的关系,不难看出当逆序遍历 digits 数组时,digits 数组的下标恰与 currencyUnit 单位符合
     *  digits[10]    =     {5,   4,   3,   7,   2,   2,   3,   1,   8}  | 813227345
     *  currencyUnit[9] = {'\0', 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'} | 八亿一千三百二十二万七千三百四十五
     */
    char currencyUnit[9] = {'\0', 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'};

    // 从 digits 数组尾往头遍历,输出对应的人民币值
    for (int i = len - 1; i >= 0; i--) {
        if (digits[i]) {
            // 字母 a-j 对应数字 0-9,此处输出 money 值及单位,巧用下标 i 与币值单位数组 currencyUnit 的对应关系
            printf("%c%c", digits[i] + 'a', currencyUnit[i]);
        } else if (i == 4) {
            // 判断是否需要输出币值单位万,当且仅当 i == 4 并且存在十万 | 百万 | 千万时才输出 W
            if (digits[5] || digits[6] || digits[7]) {
                printf("W");
            }
        } else if (i - 1 >= 0 && digits[i - 1]) {
            /*
             * 题目要求:“零” 的用法必须符合中文习惯,
             * 向前看一位判断是否输出当前 0 对应的 a,当且仅当当前 0 不是 money 的末位数字且 0 的前一个数字不为 0 时才输出 a,
             * 如 6900(六千九百 gQjB digits = {0, 0, 9, 6, 0...}) 不需要输出 0,
             * 而 6090(六千零九十 gQajS digits = {0, 9, 0, 6, 0...})仅需要输出 6 和 9 中间的 0
             */
            printf("a");
        }
    }

    return 0;
}
  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春天熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值