0%

PAT A1082 Read Number in Chinese

题目链接

我的解法

解题思路

这个题目的题解说实话我也说不上来具体方法是什么,就是一步一步调试来的。比如设置两个数组,一个unit数组表示单位(从亿到个位),一个nums数组表示每个数的拼音。我的大体思路如下(实际编码顺序):

1、首先考虑没有零的情况,就按照正常思路,打印一个数,一个单位,但是注意个位是没有单位的,所以n>8要单独处理。

2、然后考虑0的情况,比较复杂。设置一个数组f来标记连续为0的情况。只要当前字符为0,并且没有遍历过,那f数组就设为true,然后从当前下标往后遍历,每次遇到0就标记数组f为true,直到遇到第一个不为零的数,设置标志位,并跳出内循环。中间遇到的零都不输出单位和0,而是用一个ling来代替,但是Wan是必须输出的,也就是j+n==5的时候,必须输出Wan。比如1101111,1001121,如果一直到Wan位都是0,就不用输出ling,直接一个Wan。但是如10011111,就必须输出一个ling,没有单位。

3、要考虑从亿位到万位中间全为0的情况,也就是中间的Wan不用输出,如:100001234一亿一千二百三十四,只需要在ling的分支的输出Wan的分支,当j+n==5的分支中,再考虑要不要输出Wan,也就是要看从亿位到万位中间是不是全部为0。需要再加分支来判断是不是有亿位,没有的话Wan正常输出,有的话要考虑第一位是不是’-‘,如果是,亿位的判断要根据长度len变化。然后设置标志位,亿到万中间有非零的时候for循环,打印ling,没有的话就不打印Wan。

误区

一定要注意空格的输出,特别是第一位是否为负的情况要单独考虑啊!所以先打印第一位,但是又要注意是否只有一位数,一位数就不需要输出单位。

我的代码

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <string>
using namespace std;
string unit[]={"Fu","Yi","Qian","Bai","Shi","Wan","Qian","Bai","Shi"};
string nums[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
bool f[10]={false};//判断每一位是否为0

int main(){
string s;
cin>>s;
int len=s.length();
int n; //假装补全9个数

bool flag=false;
n=9-len+1;//0

if(s[0]=='-') cout<<"Fu";
else {
if(n<9) cout<<nums[s[0]-'0']<<" "<<unit[n+0];
else cout<<nums[s[0]-'0'];//只有一位的情况
}
for(int i=1;i<len;i++){
if(s[i]=='0'){
if(f[i]==false){
int j=i;
while(j<len){
if(s[j]=='0'){
f[j]=true;
if(j+n==5){//输出万位
bool help=true;//判断是否从亿位到万位都为零
if(s[0]=='-'){//如果第一位是'-'
if(len>9){
for(int k=1;k<=j;k++){
if(s[k]!='0'){
help=false;
break;
}
}
if(!help){
cout<<" "<<unit[n+j];
}
}else{
cout<<" "<<unit[n+j];
}
}else{
if(len>=9){
for(int k=1;k<=j;k++){
if(s[k]!='0'){
help=false;
break;
}
}
if(!help){
cout<<" "<<unit[n+j];
}
}else{
cout<<" "<<unit[n+j];
}
}
}
}
else{
flag=true;
break;
}
j++;
}
}
if(flag){
if(i+n!=5){
cout<<" ling";
flag=false;
}

}
}else {//没有零的情况
cout<<" ";
if(n+i<9) {
cout<<nums[s[i]-'0']<<" "<<unit[n+i];//单位只有八个
}
else cout<<nums[s[i]-'0'];
}
}
return 0;
}

算法笔记解法

待补!

本文标题:PAT A1082 Read Number in Chinese

文章作者:GavinYGM

发布时间:2020年08月24日 - 09:08

最后更新:2020年08月28日 - 11:08

原始链接:http://www.gavinygm.cn/2020/08/24/PAT-A1082-Read-Number-in-Chinese/

许可协议: 转载请保留原文链接及作者。