1082. Read Number in Chinese (25)

题目如下:

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

题目要求按照中国人的习惯阅读一个不超过9位的数字,这道题的坑比较多,一定要考虑到所有的情况。

首先要抓住规律,我们可以发现,一个数字的读法在每个4位是一致的。

例如12341234,我们读作“一千二百三十四万一千二百三十四”,我们可以看到除去万字以外读法完全一致。因此我们集中精力解决四位数的读法,然后加上亿、万等即可。

在解决的时候,注意0的读法,例如1000读作一千,而1050读作一千零五十,1005读作一千零五,另外根据题目要求,10读作一十而不是十。

四位的读法分析:一次性传入4位,高位允许全0,因为要处理不同部位的4位。

①一位数直接读,读作零到九。

②两位数判断十位是否是0,如果是,并且个位不是0,设个位为x,应该读作零x,例如10,0005,传入0005,整个数应该读作十万零五;如果十位为0并且个位为0,则不读。例如10,0000,万已经由高4位处理完毕,读作10万,低位不必读。

③三位数、四位数和两位数的思路一致,首先判断是否为0,如果发现当前位为0并且该位后面有不为0的,应该读一个零,注意不要读多了。

④一般情况只需要按照不同的位先输出数字,然后输出Qian Bai Shi即可,注意缩进处理。

把处理四位数的方法封装成一个函数。

整个数的处理方法为≤4位的直接用上面的函数,>4的截取不同的字符段来得到不同的位,每4位一截取。

代码如下:

#include <iostream>
#include <string>
#include <string.h>
#include <sstream>
#include <stdio.h>

using namespace std;

char* values[] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

int char2int(char c){
    return c - '0';
}

void handleNum(string num){

    int bits = num.length();

    bool printZero = false;
    switch(bits){
        case 1:{
            int ge = char2int(num[0]);
            printf("%s",values[ge]);
            break;
        }
        case 2:{
            int shi = char2int(num[0]);
            int ge = char2int(num[1]);
            if(shi != 0) printf("%s Shi",values[shi]);
            else if(!printZero){
                printf("ling");
                printZero = true;
            }
            if(ge != 0) printf(" %s",values[ge]);
            break;
        }
        case 3:{
            int bai = char2int(num[0]);
            int shi = char2int(num[1]);
            int ge = char2int(num[2]);
            if(bai != 0) {printf("%s Bai",values[bai]); printZero = false;}
            else if(!printZero && (shi !=0 || ge != 0)){
                printf("ling");
                printZero = true;
            }
            if(shi != 0) { printf(" %s Shi",values[shi]); printZero = false; }
            else if(!printZero && ge!=0){
                printf(" ling");
                printZero = true;
            }
            if(ge != 0) printf(" %s",values[ge]);
            break;
        }
        case 4:{
            int qian = char2int(num[0]);
            int bai = char2int(num[1]);
            int shi = char2int(num[2]);
            int ge = char2int(num[3]);
            if(qian != 0) {printf("%s Qian",values[qian]); printZero = false;}
            else if(!printZero && (bai!=0 || shi!=0 || ge!=0)){
                printf("ling");
                printZero = true;
            }
            if(bai != 0) {printf(" %s Bai",values[bai]); printZero = false;}
            else if(!printZero && (shi != 0 || ge != 0)){
                printf(" ling");
                printZero = true;
            }
            if(shi != 0) {printf(" %s Shi",values[shi]); printZero = false;}
            else if(!printZero && ge != 0){
                printf(" ling");
                printZero = true;
            }
            if(ge != 0) printf(" %s",values[ge]);
        }
    }

}

int main()
{
    string num;
    cin >> num;
    if(num[0] == '-'){
        num = num.substr(1);
        cout << "Fu ";
    }
    int bits = num.length();
    switch(bits){
    case 1:
    case 2:
    case 3:
    case 4:
        handleNum(num);
        break;
    case 5:{
        int wan = char2int(num[0]);
        printf("%s Wan ",values[wan]);
        handleNum(num.substr(1));
        break;
    }
    case 6:{
        handleNum(num.substr(0,2));
        printf(" Wan ");
        handleNum(num.substr(2));
        break;
    }
    case 7:{
        handleNum(num.substr(0,3));
        printf(" Wan ");
        handleNum(num.substr(3));
        break;
    }
    case 8:{
        handleNum(num.substr(0,4));
        printf(" Wan ");
        handleNum(num.substr(4));
        break;
    }
    case 9:{
        handleNum(num.substr(0,1));
        printf(" Yi ");
        handleNum(num.substr(1,4));
        printf(" Wan ");
        handleNum(num.substr(5));
        break;
    }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 19:15:43

1082. Read Number in Chinese (25)的相关文章

PAT 1082. Read Number in Chinese (25)

1082. Read Number in Chinese (25) 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

1082. Read Number in Chinese (25)【字符串处理】——PAT (Advanced Level) Practise

题目信息 1082. Read Number in Chinese (25) 时间限制400 ms 内存限制65536 kB 代码长度限制16000 B 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

PAT (Advanced Level) 1082. Read Number in Chinese (25)

模拟题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<iostream> #include<algorithm> using namespace std;

【PAT甲级】1082 Read Number in Chinese (25 分)

题意: 输入一个九位整数,输出它的汉字读法(用拼音表示). trick: 字符串数组""其实会输出一个空格,而不是什么都不输出,导致测试点0和4格式错误. 代码: #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int num[17];string united[17]={"","yi","er","san&qu

1082 Read Number in Chinese (25 分)

1082 Read Number in Chinese (25 分) Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output Fufirst if it is negative. For example, -123456789 is read as Fu yi Yi er Qian san Bai si Shi wu Wan li

A1082 Read Number in Chinese (25)(25 分)

A1082 Read Number in Chinese (25)(25 分) 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 B

Read Number in Chinese (25)

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

PAT 1082. Read Number in Chinese

#include <cstdio> #include <cstdlib> #include <string> #include <vector> #include <algorithm> using namespace std; const char* d2cn[] = {"ling", "yi", "er", "san", "si", "

PAT1082. 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 Sh