Pat A 1082 Read Number in Chinese

先把最常见的情况写出来,不断在中间加上一些判断条件就可以了。

分享一些测试数据:

0
ling
8
ba
808080808
ba Yi ling ba Bai ling ba Wan ling ba Bai ling ba
-880808080
Fu ba Yi ba Qian ling ba Shi Wan ba Qian ling ba Shi
800000008
ba Yi ling ba
800000000
ba Yi
80000008
ba Qian Wan ling ba
80008000
ba Qian Wan ba Qian
80000000
ba Qian Wan

接下来赋上已Ac代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

int main(){

    char ch [10][10] = {"","Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi"};//9
    char nuch [11][10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu","shi"};
    char c[11];
    scanf("%s",c);
    int len = strlen(c);//用来输出nuch中的值
    int reality = len;//用来输出ch的值
    int i = 0;
    if(c[i] == '-'){//判断是否为负数
        printf("Fu ");
        i ++;
        reality --;//要与ch中输出位一致
    }else{//将整数向后移动一位,相当于前面加了一个‘+’号
        for(int j = len;j > 0;j --){
            c[j] =  c[j - 1];
        }
        i ++;
        len ++;//长度增加一

    }

    int space = 0;//因为该题控制了空格,当每次输出后应加上一个空格
    int ling = 0;//如果有零那么加一,等到再一次输出时,应该优先输出'ling'再输出相应的数字,并且输出完'ling'后,记得将其清零,因为它已经用完了。
    for(;i < len - 1;i ++){
        if(c[i] == '0'&&reality - i != 4&&reality - i != 8){//碰上'0'就循环,碰上'Yi'和'Wan'即使为'0'也不能用该功能处理。
            ling ++;
            continue;
        }else
        if((reality - i == 4||reality - i == 8)&&c[i] == '0'&&ling != 3){//碰上'Yi'和'Wan'并且,ling的个数不能等于三个,因为等于三个相当于,本位为零
        //并且前三位也为零,说明该四位为零,没必要输出'Wan'。
            if(space != 0){
                space --;
                printf(" ");
            }
            printf("%s",ch[reality - i]);
            ling = 0;
            //cout<<ling<<endl;
            space++;
        }else if(ling!=3&&c[i]!= '0'){//说明四位都为ling,不需要输出
                if(space != 0){
                    space --;
                    printf(" ");
                }//此处是怕下一步要输出ling做的
                if(ling != 0){
                    ling = 0;
                    printf("ling");//正常输出0
                    space++;
                }
                if(space != 0){
                    space --;
                    printf(" ");//如果上一步输出了0就要输出空格
                }
                printf("%s %s",nuch[c[i] - '0'],ch[reality - i]);//普通的情况就这样输出就好了
                space++;
        }
    }
    if(c[i] != '0'){//最后一位 特殊处理一下
            if(space != 0){
                space --;
                printf(" ");
            }
            if(ling != 0){
                    ling = 0;
                    printf("ling");
                    space++;
            }
            if(space != 0){
                space --;
                printf(" ");
            }
            printf("%s\n",nuch[c[i] -'0']);
    }
    if(len == 2&&c[1] == '0'){//特判下0的情况
        printf("ling\n");
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值