PAT-A-1082 Read Number in Chinese (25 分) 数字转中文读法,字符串处理C++题解
        【摘要】 
                    
                        
                    
                    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
二、解题思路
将数字转化为字符串,然后按位判断。
 注意点:
- 当数字中间隔了零,无论有多少个连续的零,都只读一次“ling”,那么只需要判断零与非零的临界点处读“ling”即可。
- 当前位下标i%4,分别对应单位“Ge”、“Shi”, “Bai”, “Qian”, 不过“Ge”不需要读出来,所以当i%4!=0时,才需要读单位。
- 如果当前位下标i是4,且万位组的值不为0,也就是n%10000000/10000不为零时,才读单位“万”。如100000007,读作“yi Yi ling qi”,中间万位组单位“Wan”不用读。而104000007,要读“yi Yi ling si Bai Wan ling qi”,需要读中间的单位“Wan”。
- 如果当前下标i是8,且亿位组的值不为0,也就是n/100000000不为零才读单位“亿”。同上。
- 由于是反向存放的结果集中的,所有有单位时,要先存单位再存数值。
- 当前数值如果是零,则判断下一位是否为零,如果下一位不是零,则存入“ling”。
- 如果当前位不是零,则直接将当前位存入结果集。
代码中有注释解释。
三、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)