[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
全部评论
输出错误,有提示,可以改,格式错误,又不说是哪一行,什么样的错误,难查
点赞 回复
分享
发布于 2018-02-17 14:49
真不知道自己错在哪了,自己检查没有任何问题
点赞 回复
分享
发布于 2018-03-04 15:29
小红书
校招火热招聘中
官网直投

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务