[PAT解题报告] Read Number in Chinese
不难,但很麻烦。用中文读一个数。
数不超过9位。
我是补足12位的,首位补0。
按照我们读数的方法,4位一级。
(xxxx)(yyyy)(zzzz)
xxxx是亿
yyyy是万
zzzz是个,不用读。
话虽如此,细节很多。
首先,读4位数,先写好,要注意
零什么时候读,什么时候不读,什么时候读一个……
只有第一次遇到0(前面非0),才读而且值读一个0。

读好4位数,我的算法是读3个4位数就好了。
但是仍然要注意0的问题。
全是0的时候,之前没读过东西就不读,否则要读一个0。
还有如果这个数< 1000,也就是不足4位,之前有东西的时候,还是要读一个0。
每读一个四位数加上一个单位,亿或者万,全0又不加……
细节规则,慢慢处理。

代码:
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

const string number[] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
const string weight[] = {"Qian","Bai","Shi",""};
const string we[] = {"Yi","Wan",""};

string readnumber(const char *s) {
int i;
    for (i = 0; (i < 4) && (s[i] == '0'); ++i)
    ;
    if (i >= 4) {
        return number[0];
    }
    string answer = number[s[i] - '0'];
    if (i < 3) {
        answer += " " + weight[i];
    }
    bool mark = false;
    for (++i; i < 4; ++i) {
        if (s[i] == '0') {
            mark = true;
        }
        else {
            if (mark) {
                answer += " " + number[0];
                mark = false;
            }
            answer += " " + number[s[i] - '0'];
            if (i < 3) {
                 answer += " " + weight[i];
            }
        }
            
    }
    return answer;         
}

int main() {
char s[100];
bool sign = true;
    scanf("%s",s);
    string num;
    if (s[0] == '-') {
        sign = false;
        num = s + 1;
    }
    else if (s[0] == '+') {
        num = s + 1;
    }
    else {
        num = s;
    }
    while (num.size() < 12) {
        num = "0" + num;
    }
    bool mark = false;
    string answer = "";
    for (int i = 0, j = 0; i < 3; ++i) {
        int x = (num[j] - '0') * 1000 + (num[j + 1] - '0') * 100 + (num[j + 2] - '0') * 10 + num[j + 3] - '0';
        if (x == 0) {
            if (!answer.empty()) {
                mark = true;
            }
        }
        else {
            if ((!answer.empty()) && (mark || (x < 1000))) {
                answer += " " + number[0];
                mark = false;
            }
            if (!answer.empty()) {
                answer += " ";
            }        
            answer += readnumber(num.c_str() + j);
            if (i < 2) {
                answer += " " + we[i];
            }
        }
        j += 4;
    }
    if (answer.empty()) {
        puts(number[0].c_str());
    }
    else {
        if (!sign) {
            printf("Fu ");
        }
        puts(answer.c_str());
    }
    return 0;
}

原题链接: http://www.patest.cn/contests/pat-a-practise/1082

注意!此信息未认证,请谨慎判断信息的真实性!

全部评论
空

相关内容推荐

头像
点赞 评论 收藏
转发
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像 头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像 头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
点赞 收藏 评论
分享

全站热榜

正在热议