题意就是给出9位以内的数字,按照汉子的读法读出来。
读法请看下方的几个例子:
5 0505 0505 伍亿零伍佰零伍万零伍佰零伍
5 5050 5050 伍亿伍仟零伍拾万伍仟零伍拾 (原本我以为这个是读:伍亿伍仟零伍拾万"零"伍仟零伍拾)
5 0550 0055 伍亿零伍佰伍拾万零伍拾伍
5 5005 5500 伍亿伍仟零伍万伍仟伍佰
5 5500 0055 伍亿伍仟伍
按四位四位的分开处理,具体见代码~
#include <iostream> #include <cstdio> #include <string.h> #include <algorithm> using namespace std; char number[15]; bool first=true; char str1[3][10]={"Fu","Yi","Wan"}; char str2[4][10]={"","Shi","Bai","Qian"}; char digit[10][10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"}; /* cnt表示该位的右边还剩下left-1位(包括该位) read是4位4位的读 */ void read(int idx,int left){ if(left==0) return; if(number[idx]=='0'){ bool allZero=true; //判断接下来的是否都是0,若都是就不需要读ling int cnt=0; for(int i=idx;i<idx+left;i++){ if(number[i]!='0'){ allZero=false; break; } else cnt++; } if(!allZero){ printf(" ling"); read(idx+cnt,left-cnt); } } else{ if(!first) printf(" "); else first=false; printf("%s",digit[number[idx]-'0']); if(left>1) printf(" %s",str2[left-1]); read(idx+1,left-1); } } int main() { first=true; scanf("%s",number); int len=strlen(number); int left=len; int idx=0; int a=atoi(number); //注意0这个特例!!!,没有考虑这个导致WA if(a==0){ printf("ling"); return 0; } if(number[0]=='-'){ first=false; printf("Fu"); left--; idx++; } if(left>=9){ if(!first){ printf(" "); } else first=false; printf("%s",digit[number[idx]-'0']); printf(" Yi"); left--; idx++; } //万位上的四位 if(5<=left && left<=8){ read(idx,left-4); idx+=left-4; left=4; printf(" Wan"); } //低位上的四位 if(1<=left<=4){ read(idx,left); } return 0; }