PAT A 1082 Read Number in Chinese (25 分)

一、思路

使用整型num读入,若num<0输出"Fu “并转换为正数,若num为0,输出"ling”。
将num转换为字符串,并i = 0开始遍历,j = 串长 - 1开始递减,记录该位是第几位

1、构造三个字符串数组:
digit[10][5] = { “ling”, “yi”, “er”, “san”, “si”, “wu”, “liu”, “qi”, “ba”, “jiu” };
place1[3][5] = { “”, " Wan", " Yi" };
place2[4][6] = { “”, " Shi", " Bai", " Qian" };

2、非零数字的输出
即输出数组:digit[ str[i] ],然后输出该位后缀:place2[ j % 4 ];

3、零的输出
观察ling的输出规律:若当数字非0,且其左侧(直接前驱)是零(一或多个),则要输出"ling"
因此,若遍历中遇到0,则zero = 1。则之后若遇到某位是非零数字,且zero = 1,便先输出一个"ling", 并使zero = 0。

4、亿、万的输出
若j是4的倍数,则要输出亿或万,但有条件:若这四位没输出过非零数字,则不能输出。
例如:9 0000 8000读为九万零八千,万的四位没有输出。
则遇到非零数字,使tag = 1。当j%4 == 0,且tag == 1时,输出亿或万,并恢复tag == 0.

注意:测试点3答案错误:输入0时仅输出0;

二、代码

#include <cstdio>
#include <cstring>
int main()
{
    char digit[10][5] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" }, place1[3][5] = { "", " Wan", " Yi" }, place2[4][6] = { "", " Shi", " Bai", " Qian" }, str[10];
    int num;
    scanf("%d", &num);
    if( num <= 0 )
    {
        printf("%s", num < 0 ? "Fu ":"ling");
        num *= -1;
    }
    sprintf(str, "%d", num);
    for( int i = 0, zero = 0, tag = 0, j = strlen(str) - 1; i < strlen(str); ++i, --j )
    {
        if( str[i] == '0' )
            zero = 1;
        else
        {
            printf("%s%s%s%s", i ? " ":"", zero ? "ling ":"", digit[ str[i] - '0' ], place2[j % 4]);
            tag = 1;
            zero = 0;
        }
        if( j % 4 == 0 && tag )
        {
            printf("%s", place1[ j / 4 ]);
            tag = 0;
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值