题目描述
题目大意:给定一个不超过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”~
知识点
模拟题
实现
码前思考
- 需要分为3个部分进行输出——“亿”、“万”、“个位”
代码实现
#include <cstdio>
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
using namespace std;
//初始化,妙
unordered_map<int,string> digit = {{0,"ling"},{1,"yi"},{2,"er"},{3,"san"},
{4,"si"},{5,"wu"},{6,"liu"},{7,"qi"},{8,"ba"},{9,"jiu"}};
//单位
unordered_map<int,string> dw = {{0,""},{1,"Shi"},{2,"Bai"},{3,"Qian"},{4,""},
{5,"Shi"},{6,"Bai"},{7,"Qian"},{8,"Yi"}};
string input;
string num;
vector<string> output;
int main(){
cin>>input;
//特判0
if(input.size() == 1 && input[0] == '0'){
printf("ling");
return 0;
}
if(input[0] == '-'){
output.push_back("Fu");
num = input.substr(1,input.size()-1);
}else{
num = input;
}
//去除前导0
while(num[0] == '0'){
num = num.substr(1,num.size()-1);
}
//接下来进行遍历,首先获取长度
int len = num.size()-1;
int idx = len;
if(idx == 8){//代表有亿位
//如果此位不为0
if(num[len-idx]-'0' != 0){
//输出亿位
output.push_back(digit[num[len-idx]-'0']);
output.push_back(dw[idx]);
//注意--
idx--;
}
}
//接下来是判断是否在万之中
bool flagW = false;
bool zero = false;
while(idx >= 4 ){
if(num[len-idx]-'0' == 0){//说明有0
//output.push_back("ling");
zero = true;
}else{
//如果不存在0
flagW = true;
if(zero == true){
output.push_back("ling");
zero = false;
}
output.push_back(digit[num[len-idx]-'0']);
if(idx!=4){
output.push_back(dw[idx]);
}
}
//最后减
idx--;
}
if(flagW){
output.push_back("Wan");
}
//接下来是个位
bool flagL = false;
while(idx >= 0){
if(num[len-idx]-'0' == 0){
zero = true;
}else{
flagL = true;
//之前有0的话
if(zero == true){
output.push_back("ling");
zero = false;
}
output.push_back(digit[num[len-idx]-'0']);
if(idx!=0){
output.push_back(dw[idx]);
}
}
//最后减
idx--;
}
//进行输出
for(int i=0;i<output.size();i++){
cout<<output[i];
if(i!=output.size()-1){
printf(" ");
}
}
return 0;
}
码后反思
- 注意
map
的初始化,可以想上面代码那样进行初始化;(其实不需要map
。。。记得用unordered_map
吼) - 有必要去除一下前导0;
- 对于为
0
的情况需要特判,不然会有一个小小的测试点过不去!(现在就体现了软件测试的重要性了!边界值分析法,太重要了) - 我使用的是一个
vector
来保存输出,这样懒得处理空格和换行了! - 对于0的输出必须是0夹在两个数之间才会输出
ling
; - 主要还是一些细节的模拟,重点思想就是要将数字分成三块!
- 对于单个“个位”和“万位”,它是没有单位的,需要特判一下!