PAT-A 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 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.当我们在读123456789时,将1作为一组,读1“亿”,将2345作为一组,读两千三百四十五“万”,将6789作为一组,读六千七百八十九。显然,我们读数字(不超过10000亿)的时候是从低位到高位,每4位作为一组,读出这些数,再加上单位,如“万”和“亿”。

2.如果我们有一个函数,可以使用拼音读出(0,9999]的数字,那么只需要将数字从低到高,以4位为单位读出,然后再加上相应的权重,如“万”。

3.每四位为一节,节与节之间可能需要读0,或者某一节全为0,这些情况需要特殊处理。

4.在代码中,节内需要读零的情况和节与节之间需要读零的处理方法是一样的。

代码:

#include <cstdio>
/**只有我和上帝知道这些代码在做什么,1/12/2019
***不要改变代码行数,两处注释和行数有关
*/
//py是拼音(ping yin)的缩写
char *py[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
void daYinPinYin(int n)//打印拼音,将一个[0, 9999]的数字用汉字拼音读出
{
    if(n == 0)
        return;
    int qian = n / 1000;//千位数字
    if(qian != 0)
        printf("%s Qian", py[qian]);
    if(n % 1000 == 0)//是1000的整倍数,数字已经读完
        return;
    //执行到这里,百位,十位和个位不全为0
    //需要把剩下的数字读出来
    n = n % 1000;//去掉千位的数字
    int bai = n / 100;//百位数字
    if(qian != 0)//千位不为0
    {
        if(bai == 0)//百位为0
            printf(" ling ");//此时需要读ling,27行条件为假
        else
            printf(" ");//百位不为0,27行的条件为真
    }
    if(bai != 0)
        printf("%s Bai", py[bai]);
    if(n % 100 == 0)
        return;//是100的整数倍,即十位和百位都是0

    //执行到这里,说明十位和个位不全为0
    //需要把剩下的数字读出来
    n = n % 100;//去掉百位数字
    int shi = n / 10;//十位数字
    if(bai != 0)//百位不为0
    {
        if(shi == 0)//十位为0,43行条件为假
            printf(" ling ");
        else
            printf(" ");//十位不为0,43行条件为真
    }
    if(shi != 0)
        printf("%s Shi", py[shi]);
    if(n % 10 == 0)
        return;//是10的整数倍,即个位为0,数字已经读完
    //执行到这里,个位不为0,需要把个位读出来
    if(shi != 0)
        printf(" ");
    printf("%s", py[n % 10]);//读出个位
}
int main()
{
    int n;
    scanf("%d", &n);
    if(n == 0)
    {
        printf("ling");
        return 0;
    }
    if(n < 0)
    {
        printf("Fu ");
        n = -n;
    }
    int yi = n / 100000000;//亿位数字
    if(yi != 0)
        printf("%s Yi", py[yi]);
    n = n % 100000000;//去掉亿位数字
    int wan = n / 10000;//wan表示需要读多少万
    int qianwan = wan / 1000;//千万位的数字
    if(yi != 0)//亿位不为零
    {
        if(qianwan == 0)
            printf(" ling ");
        else
            printf(" ");
    }
    if(wan != 0)
    {
        daYinPinYin(wan);
        printf(" Wan");
    }
    n = n % 10000;//只留下第4位数字
    int qian = n / 1000;//千位数字
    if(wan != 0)
    {
        if(qian == 0)
            printf(" ling ");
        else
            printf(" ");
    }
    if(n != 0)
        daYinPinYin(n);
}

可以使用下面的10进制整型数实例进行测试daYinPinYin函数,包含了所有可能的情况:

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

猜你喜欢

转载自blog.csdn.net/qq_38127801/article/details/86369586