1082. Read Number in Chinese (25)

389 篇文章 1 订阅
140 篇文章 0 订阅

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

思路:从右往左进行4个数字进行一次划分,并控制输出,对0 "ling"进行特殊判断
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <fstream>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;


int main()
{ 
#ifdef _DEBUG
    //freopen("data.txt", "r+", stdin);
    fstream cin("data.txt");
#endif // _DEBUG

    queue<string> que,back;
    string RC[] = {"Shi","Bai","Qian","Wan","Yi" };
    string NP[] = {"ling", "yi","er","san","si","wu","liu","qi","ba","jiu" };
    string str;
    int left = 0 , right;
    bool zero = false, allZero;
    cin >> str;

    right = str.length() - 1;
    if (str[0] == '-')
    {
        que.push("Fu");
        ++left;
    }
    while (left + 4 <= right)
        right -= 4;

    for (int size = str.length(); left < size; )
    {

        allZero = true; zero = false;
        while (left <= right)
        {
            if (str[left] == '0')
                zero = true;
            else
            {
                if(zero && left >= 4)
                    que.push("ling");

                que.push(NP[str[left] - '0']);
                if (left != right)
                    que.push(RC[right - left - 1]);
                zero = allZero = false;
            }
            ++left;
        }
        if (!allZero && right != size - 1)que.push(RC[(size - right - 1) / 4 + 2]);
        right += 4;
    }

    if (str.length() == 1 && str[0] == '0')
        cout << "ling";

    while (!que.empty())
    {
        cout << que.front();
        que.pop();
        if (!que.empty())
        {
            if (!que.empty())
                cout << " ";
        }
    }

#ifdef _DEBUG
    cin.close();
#ifndef _CODEBLOCKS
    std::system("pause");
#endif // !_CODEBLOCKS
#endif // _DEBUG

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值