题目链接:PAT【甲级】1082
题目简述:给定⼀个不超过9位的整数,你应该用传统的中文方式阅读它。 如果是负的,⾸先输出“Fu”, 例如,-123456789被读作“Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu”。 注意:零(“ling”)必须根据中国传统正确处理。 例如,100800是“yi Shi Wan ling ba Bai”。
#include<bits/stdc++.h>
using namespace std;
string radix[4] = {"", "Shi", "Bai", "Qian"};
string bitt[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
stack<string> ans;
int main(){
int n, w = 0, t = 0;
cin >> n;
if(n < 0) cout << "Fu ";
n = abs(n);
if(n == 0) ans.push(bitt[0]);//特殊情况
while(n != 0){
//这三行是初始化,接下来每组再进行相同的处理
if(w == 4) ans.push("Wan");
if(w == 8) ans.push("Yi");
if(w % 4 == 0) t = 0;
if((n % 10 == 0 && t != 0) || n % 10 != 0){//对于后缀0不作处理,跳过
if(w % 4 != 0 && n % 10 != 0)//添加其数位标志【对于个位数或元素0不作处理】
ans.push(radix[w % 4]);
ans.push(bitt[n % 10]);
t = n % 10 != 0 ? 1 : 0;//对于0标志进行处理,避免读取连续0,只保留一个就行。【为1,代表下面的第一个0可被读取】
}
w++;
n /= 10;
}
while(!ans.empty()){
cout << ans.top();
ans.pop();
if(!ans.empty()) cout << " ";
}
cout << endl;
return 0;
}
其实做这种模拟题,就是脑中先有大的框架,然后根据输入与输出来决定是否要调整代码。当然,抽象思维是很重要的东西,就比如这个题目:由于每四位可以化作一部分,而且它的处理是一模一样的,读出来的数字样式也是相同的方式,唯一不同的只有在结尾加一个Wan、Yi
,这样只需判断处理即可。
此外,还要注意特殊情况的出现。