PTA甲级 1082 Read Number in Chinese (C++)

Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output Fu first if it is negative. For example, -123456789 is read as Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu. Note: zero (ling) must be handled correctly according to the Chinese tradition. For example, 100800 is yi Shi Wan ling ba Bai.

Input Specification:

Each input file contains one test case, which gives an integer with no more than 9 digits.

Output Specification:

For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.

Sample Input 1:

-123456789

Sample Output 1:

Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu

Sample Input 2:

100800

Sample Output 2:

yi Shi Wan ling ba Bai

Caution:

数字读法

Solution:

// Talk is cheap, show me the code
// Created by Misdirection 2021-08-23 11:47:31
// All rights reserved.

#include <iostream>
#include <vector>

using namespace std;

string digit[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
string level[4] = {"", "Shi", "Bai", "Qian"};

string pronounce(string &s){
    string ans = "";

    int pos = s.length() - 1;

    // mo wei de ling bu du
    while(pos >= 0 && s[pos] == '0') pos--;

    while(pos >= 0){
        if(s[pos] != '0') ans = digit[s[pos] - '0'] + " " + level[s.length() - pos - 1] + " " + ans;
        else if(pos + 1 < s.length() && s[pos + 1] != '0') ans = digit[0] + " " + ans;
        
        pos--;
    }

    while(ans[ans.length() - 1] == ' ') ans = ans.substr(0, ans.length() - 1);
    return ans;

}

int main(){
    string num, ans = "";
    cin >> num;
    bool isNeg;
    if(num[0] == '-'){
        isNeg = true;
        num = num.substr(1);
    }
    else isNeg = false;

    if(num.length() == 1){
        if(isNeg) printf("Fu %s\n", digit[num[0] - '0'].c_str());
        else printf("%s\n", digit[num[0] - '0'].c_str());

        return 0;
    }

    string yiji, wanji, geji;
    if(num.length() > 8){
        ans = digit[num[0] - '0'] + " Yi ";
        
        wanji = num.substr(1, 4);
        geji = num.substr(5, 4);

        if(pronounce(wanji) != "") ans = ans + pronounce(wanji) + " Wan " + pronounce(geji);
        else ans = ans + pronounce(wanji) + pronounce(geji);
    }
    
    else if(num.length() > 4){
        wanji = num.substr(0, num.length() - 4);
        geji = num.substr(num.length() - 4, 4);

        ans = pronounce(wanji) + " Wan " + pronounce(geji);
    }
    else ans = pronounce(num);
    
    if(isNeg) printf("Fu %s\n", ans.c_str());
    else printf("%s\n", ans.c_str());

    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

负反馈循环

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

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

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

打赏作者

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

抵扣说明:

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

余额充值