「1082」Read Number in Chinese

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

Ω

救命,好难啊,我再一次体会到了中国文化的博大精深。

- 你真的会用汉语读数字吗?

- 会啊会啊

- 你能教会计算机读吗?

- 简简单单

-(to Mr.Computer)每个数字读完后加上它的位名

-(Mr.Computer)一十万二万三千四百五十六(?)(12,3456)

-(to Mr.Computer)。。最后一位是没名字的,【亿】和【万】只在 位置输出

-(Mr.Computer)一亿零千零百零十零万零千零百零十一(1,0000,0001)

-(to Mr.Computer)诶诶诶,连续的0只要输出一个就够了, 都是0的话就不用输出位名了

-(Mr.Computer)一千零一十零(1010)

-(to Mr.Computer)。。。末尾的零不用输出

-(Mr.Computer)(null)(0)

-(to Mr.Computer)啪

-(Mr.Computer)卒

坑点基本都在上面了,两个坑点尤为突出:1. 0的处理;2. 亿万何时输出。对于0的问题,我们可以设置一个zero布尔变量,当有0出现时将其置true,然后到非0数字出现时检查zero,若为true则先加上0的读音,再将zero置false。但会出现yi Bai Wan ling yi Qian(1001000)的情况,因此在输出亿和万后也需要将zero置false。对于亿万的输出也是设置一个flag布尔数组,出现非0数后将 的flag置true,等到 位置时检查相应flag若为true则输出。另外别忘记特殊情况0。


🐎

#include <iostream>

using namespace std;

int main()
{
    string n, py[] = {"ling ", "yi ", "er ", "san ", "si ", "wu ", "liu ", "qi ", "ba ", "jiu "},
          ans, sfx[] = {"", "Shi ", "Bai ", "Qian ", "Wan ", "Shi ", "Bai ", "Qian ", "Yi "};
    bool flag[3] = {false, false, false}, zero = false;
    cin >> n;
    ans += n[0] == '-' ? (n.erase(0, 1), "Fu ") : "";
    for (int i = 0; i < n.size(); ++i)
    {
        if (n[i] == '0')
        {
            zero = true;
            int r = int(n.size() - i - 1);
            if (flag[r / 4] && r % 4 == 0)
            {
                ans += sfx[r];
                zero = false;
            }
            continue;
        }
        ans += zero ? (zero = false, py[0]) : "";
        ans += py[n[i] - '0'] + sfx[n.size() - i - 1];
        flag[(n.size() - i - 1) / 4] = true;
    }
    if (n == "0") ans += py[0];
    ans.erase(ans.size() - 1);
    cout << ans;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值