⭐⭐⭐⭐⭐PAT A1082 Read Number in Chinese

题目描述

题目大意:给定一个不超过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”~

知识点

模拟题

实现

码前思考

  1. 需要分为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;
} 

码后反思

  1. 注意map的初始化,可以想上面代码那样进行初始化;(其实不需要map。。。记得用unordered_map吼)
  2. 有必要去除一下前导0;
  3. 对于为0的情况需要特判,不然会有一个小小的测试点过不去!(现在就体现了软件测试的重要性了!边界值分析法,太重要了)
  4. 我使用的是一个vector来保存输出,这样懒得处理空格和换行了!
  5. 对于0的输出必须是0夹在两个数之间才会输出ling
  6. 主要还是一些细节的模拟,重点思想就是要将数字分成三块!
  7. 对于单个“个位”和“万位”,它是没有单位的,需要特判一下!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值