PAT_1082 Read Number in Chinese

题目链接
在这里插入图片描述
在这里插入图片描述

整体思路,读入int,首先判断正负,单独输出“Fu”,然后转化为正数处理;
将数字转化为字符串存储(0-8位),高位在前,即位置0存的是亿位,位置8存的是个位;
第一个非零位置开始输出,对应位数字非0,则输出该数字及对应的位名;若对应位数字为0,按照规则,亿万个其实是3个分界,亿和万之间、万和个之间至多读一个零,也可能不读零,连续的0只需要读一次,并且不需要读对应的位名,若在万位或者个位之前零中断了就读出零,如10021002读为一千零二万一千零二,如果连续的零跨过了万或者恰好在万位处断则不读出零,如13001000读作一千三百万一千,3后面连续的零到万位中断,这个零不会被读出来,一千后面的零也不必读出来,因为连续的零到个位中断;
注意到1到4位读的规律和5到8位读的规律是一样的,只不过到第四位时需要加“万”,第八位不需要加“个”,但是如果1到4位都为0的话,就不必输出万了。
综上简单地说,就是从第一个非零数字开始输出,若对应位数字非零,则输出数字及对应单位,遇到连续的0不做处理,(但是不能用continue,因为后面特判wan的时候在100800情况下用continue会跳过特判wan),连续的0在万或个之前中断输出ling,在万和个处0不连续不输出ling;特殊处理输出wan,1-4位有一个不为0就输出wan;在输出数字前后来添加空格,保证格式。

测试点0就是没有零顺着读的简单情况;
测试点1是100800这种情况;
测试点3就是一个0,特判一下就好,独立想到的,开心呜呜;
·
·
·
完整代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
string number[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string wei[9]={"Yi","Qian","Bai","Shi","Wan","Qian","Bai","Shi",""};
int main() {
    int n;
    cin >> n;
    if(n<0){
        n=-n;
        cout << "Fu ";
    }
    char num[9];
    int tmp=n;
    for(int i=0;i<9;i++){
        num[i]=tmp%10+'0';
        tmp=tmp/10;
    }
    reverse(num,num+9);
    bool wan=false;
    int nonzero=9;//先寻找第一个非零位置
    for(int i=0;i<9;i++){
        if(num[i]!='0'){
            nonzero=i;
            break;
        }
    }
    //从第一个非零位置读起
    for(int i=nonzero;i<9;i++){
        if(num[i]!='0'){
            if(i>=1 && i<=4) wan=true;//1-4位有一个非零数字,就要输出单位万
            if(i!=nonzero) cout << " ";//第一个数字前无空格,以后的非零数字都要加空格隔开前面的单位
            if(i!=4 && i!=8) cout << number[num[i]-'0'] << " " << wei[i];//i=4对应万,i=8对应个,都单独处理
            else if(i==8) cout << number[num[i]-'0'];//单独处理个位,没尾部空格
        }else{//遇到零了
            if(i+1<9 && num[i+1]=='0'){
                ;//不能用continue,对于100800,i==4需要特殊处理wan了,一旦continue后面就无法特判了
            }
            else if(i!=4 && i!=8){//不是万或个处0中断才输出ling
                cout << " ling";
            }
        }
        //wan单独处理一下
        if(i==4 && wan==true){
            if(num[i]!='0')
                cout << number[num[i]-'0']<< " " << wei[i];//万这位非0,在前面i!=nonzero时已经输出过空格了
            else cout << " " << wei[i];//万这位为0,说明前面以单位结尾,需要加个空格
        }
    }
    if(nonzero==9) cout << "ling";
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值