题目链接
我的解法
解题思路
这个题目的题解说实话我也说不上来具体方法是什么,就是一步一步调试来的。比如设置两个数组,一个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};
int main(){ string s; cin>>s; int len=s.length(); int n; bool flag=false; n=9-len+1; 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; }
|
算法笔记解法
待补!