PAT 1082. Read Number in Chinese (25)(把九位内的数字翻译成拼音输出)

官网

1082. Read Number in Chinese (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
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

题目思路

  • 1.把一个少于等于9位数翻译成中文拼音输出。
  • 2.注意10101010,10100101,-101010101。

解题思路

  • 1.我是先读亿位,然后读万位,然后读后面四位,其中万位的那四位数可以先利用读后面四位数的方法读出,然后再输出’wan’,以及看情况决定是否在其后面输出’ling’。

AC代码

#include<iostream>
#include<string>
using namespace std;
string shuwei[] = {"Shi","Bai","Qian","Wan","Yi"};
string shuzi[] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
int now;
bool biggerThan9999 = false;
void read_it(int k){
//先读亿位
    if (k>99999999)
    {
        now = k / 100000000;
        k = k % 100000000;
        cout << shuzi[now] << " Yi";
        if (k>0)
        {
            cout << " ";
            if (k>9999999)
            {
                read_it(k);
            }
            else{
                cout << "ling ";
                read_it(k);
            }
        }else
            cout << endl;
    }
    //递归读万位
    else if (k>9999)
    {
        now = k / 10000;
        int nx = k % 10000;
        read_it(now);
        cout << " Wan";
        if (nx==0)
        {
            cout << endl;
            return;
        }
        //这个是读出万位后与后面的衔接阶段,看是否要输出ling
        if (nx>0&&nx<1000)
        {
            cout << " ling";
        }
        cout << " ";
        read_it(nx);
    }
    //读后面四位也用到递归了
    else if (k>999)
    {
        now = k / 1000;
        int nx = k % 1000;
        cout << shuzi[now] << " Qian";
        if (nx == 0)
        {
            if (biggerThan9999)
            {
                biggerThan9999 = false;
            }
            else{
                cout << endl;
                return;
            }
        }
        else
        {
            if (nx<100)
            {
                cout << " ling";
            }
            cout << " ";
            read_it(nx);
        }
    }
    else if (k>99)
    {
        now = k / 100;
        int nx = k % 100;
        cout << shuzi[now] << " Bai";
        if (nx == 0)
        {
            if (biggerThan9999)
            {
                biggerThan9999 = false;
            }
            else{
                cout << endl;
                return;
            }
        }
        else
        {
            if (nx<10)
            {
                cout << " ling";
            }
            cout << " ";
            read_it(nx);
        }
    }
    else if (k>9)
    {
        now = k / 10;
        int nx = k % 10;
        cout << shuzi[now] << " Shi";
        if (nx == 0)
        {
            if (biggerThan9999)
            {
                biggerThan9999 = false;
            }
            else{
                cout << endl;
                return;
            }
        }
        else
        {
            cout << " ";
            read_it(nx);
        }
    }
    else if (k>0)
    {
        cout << shuzi[k];
        if (biggerThan9999)
        {
            biggerThan9999 = false;
        }
        else{
            cout << endl;
            return;
        }
    }
}
int main(){
    int num;
    cin >> num;
    if (num==0)
    {
        cout << "ling" << endl;
        return 0;
    }
    if (num<0)
    {
        cout << "Fu" << " ";
        num = -num;
    }
    if (num>9999)
    {
        biggerThan9999 = true;
    }
    read_it(num);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值