PAT甲级1082.

目录

A1082

题目

样例

样例1

输入:

-123456789

输出:

Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu

样例2

输入:

100800

输出:

yi Shi Wan ling ba Bai

思路和坑点

  依次对每一位进行处理,将数字和单位分开考虑,其中“万”一定会被读到,其他的单位需要考虑0的读法,由于0的读法和前一位有关,如果前一位不是0,并且不是“个位、万位、亿位“则需要读零。正负最后考虑,由于从低位到高位读,所以最终的输出序列中先读入单位,再读入数字,最后倒序输出。

AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){    
#ifdef ONLINE_JUDGE    
#else    
    freopen("1.txt", "r", stdin);    
#endif 
    //数字位读法
    string shu[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
    //位数的读法
    string wei[10]={"0","0","Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi"};
    int n;                  //读入要处理的数 
    int tag=0;              //正负数标记,1表示负数,0表示正数 
    cin>>n;
    vector<string> v;       //用于存放最终结果,最后倒序输出 
    int now,numcnt=0,pre;   //now记录当前位的数字,pre记录前一位的数字,numcnt记录当前数字的位数 
    if(n==0) {              //特判0 
        puts("ling"); return 0;
    }
    if(n<0){
        tag=1;n=-n;         //修改正负号标记,改为正数统一处理 
    }
    while(n){
        now=n%10;
        n/=10;
        numcnt++;
        if(now){            //如果当前为不是0 
            if(numcnt>1)    //如果当前为不是个位,则需要单位 
                v.push_back(wei[numcnt]);       //如果需要单位,放入对应的单位
            v.push_back(shu[now]);              //存入数字的读法       
        }
        else{               //如果是0,考虑读不读0 
            if(numcnt==5)   //如果是万位,则加入万的单位 
                v.push_back(wei[numcnt]);
            else if(pre&&numcnt!=9&&numcnt!=1)       //如果前一位不是0,且不是亿位,万位和个位的时候读0 
                v.push_back(shu[now]);
        } 
        pre=now;            //更新pre 
    }
    if(tag==1) v.push_back("Fu");
    for(int i=v.size()-1;i>=0;i--){
        if(i!=v.size()-1) putchar(' ');
        cout<<v[i];
    }
    return 0;    
}