PAT-A-1082 Read Number in Chinese (25 分) 数字转中文读法,字符串处理C++题解

举报
楚楚冻人玥玥仙女 发表于 2021/11/19 02:37:18 2021/11/19
【摘要】 1082 Read Number in Chinese (25 分) 题目传送门:1082 Read Number in Chinese (25 分) 一、题目大意 将数字按照中文读法输出 Samp...

1082 Read Number in Chinese (25 分)

题目传送门:1082 Read Number in Chinese (25 分)

一、题目大意

将数字按照中文读法输出
Sample Input 1:

-123456789

Sample Output 1:

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

Sample Input 2:

100800

Sample Output 2:

yi Shi Wan ling ba Bai

二、解题思路

将数字转化为字符串,然后按位判断。
注意点:

  1. 当数字中间隔了零,无论有多少个连续的零,都只读一次“ling”,那么只需要判断零与非零的临界点处读“ling”即可。
  2. 当前位下标i%4,分别对应单位“Ge”、“Shi”, “Bai”, “Qian”, 不过“Ge”不需要读出来,所以当i%4!=0时,才需要读单位。
  3. 如果当前位下标i是4,且万位组的值不为0,也就是n%10000000/10000不为零时,才读单位“万”。如100000007,读作“yi Yi ling qi”,中间万位组单位“Wan”不用读。而104000007,要读“yi Yi ling si Bai Wan ling qi”,需要读中间的单位“Wan”。
  4. 如果当前下标i是8,且亿位组的值不为0,也就是n/100000000不为零才读单位“亿”。同上。
  5. 由于是反向存放的结果集中的,所有有单位时,要先存单位再存数值。
  6. 当前数值如果是零,则判断下一位是否为零,如果下一位不是零,则存入“ling”。
  7. 如果当前位不是零,则直接将当前位存入结果集。

代码中有注释解释。

三、AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	vector<string>v1{"Ge", "Shi", "Bai", "Qian", "Wan", "Yi"};
	vector<string>v2{"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
	int n;
	cin >> n;
	if(n == 0){// 特判
		cout << "ling" << endl;
		return 0;
	}
	string s = to_string(n);
	reverse(s.begin(), s.end());// 转成字符串,低位在前面
	int last = 0;
	vector<string> res;// 存放结果
	for(int i = 0; i < s.size(); i++){
		if(s[i] == '-'){
			res.push_back("Fu");// 存放
			break;
		}
		if(i == 4 and n % 100000000 / 10000){// 补充单位 万
			res.push_back(v1[4]);
		}
		if(i == 8 and n / 100000000){// 补充单位 亿
			res.push_back(v1[5]);
		}
		if(s[i] == '0'){
			if(i and s[i-1] != '0'){
				res.push_back(v2[0]);// 在零与非零的交界处出才读零,连续的零只需要读一次
			}
		}else{
			int x = i%4;
			if(x!=0){
				res.push_back(v1[x]);// 存入单位 千/百/十
			}
			res.push_back(v2[s[i]-'0']); // 存入数值。本题对十位是1的情况保持读yi Shi,如果十位为1直接读Shi,则此处还要做判断处理
			
		}
	}
	reverse(res.begin(), res.end());// 反转过来输出结果
	for(int i = 0; i < res.size(); i++){
		if(i){
			cout << " " << res[i];
		}else{
			cout << res[i];
		}
	}
	cout << endl;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

文章来源: blog.csdn.net,作者:爱玲姐姐,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jal517486222/article/details/100179682

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200