PAT_A1082
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;
}