拼音教学
拼音教学
| Time Limit: 1000MS | Memory Limit: 65535KB |
| Submissions: 76 | Accepted: 16 |
Sample Input
999999999999 123456000 1234000567
Sample Output
9qian9bai9shi9yi9qian9bai9shi9wan9qian9bai9shi9 1yi2qian3bai4shi5wan6qian 1shi2yi3qian4baiwanling5bai6shi7
解析:
这类题很大的一个特点就是分块讨论,因此用到递归就是必然的事,只需要注意特殊情况,如多个零连在一起时的情况,接下来只需分析清每部分数据的特点即可,还是看代码和注释吧
# include<iostream> # include<stdio.h> # include<string.h> # include<math.h> using namespace std; unsigned long long n; int cnt,leap; char ch[6][5]={"ling","shi","bai","qian","wan","yi"}; int lp[6]={4,3,3,4,3,2};//上面字符串的长度 char str[100]; void Copy(unsigned long long sign,int power)//Copy是对一个块的分析,用的思想也是递归 { unsigned long long th,hun; if(power==0)return; th=sign/power; if(cnt==0&&th==0) Copy(sign,power/10); else if(th==0) { if(str[cnt-1]!='g')//考虑到出现重0的情况,就不用读多次了 { strcat(str,ch[th]); cnt+=lp[th]; } Copy(sign,power/10); } else { str[cnt++]=th+'0'; hun=(int)log10((double)(power)); if(hun!=0) { strcat(str,ch[hun]); cnt+=lp[hun]; } if(sign-th*power>0) Copy(sign-th*power,power/10); else if(hun!=0) leap=1; } } void Judge(unsigned long long num)//递归思想 { unsigned long long sign; if(num>99999999)//分成两部分,亿以上和万以上 { sign=num/100000000; Copy(sign,1000); strcat(str,ch[5]); cnt+=lp[5]; if((num-sign*100000000>0)&&leap) { strcat(str,ch[0]); cnt+=lp[0]; leap=0; } Judge(num-sign*100000000); } else if(num>9999) { sign=num/10000; Copy(sign,1000); strcat(str,ch[4]); cnt+=lp[4]; if((num-sign*10000>0)&&leap) { strcat(str,ch[0]); cnt+=lp[0]; leap=0; } Judge(num-sign*10000); } else if(num>0) Copy(num,1000); } int main() { while((scanf("%lld",&n))!=EOF) { if(n==0) { printf("0\n"); continue; } cnt=0; leap=0; memset(str,0,sizeof(str)); Judge(n); str[cnt]='\0';//字符串的结束标记 printf("%s\n",str); } return 0; }
浙公网安备 33010602011771号