数的读法

来源:互联网 发布:udp端口攻击 编辑:程序博客网 时间:2024/04/30 11:31
问题描述:Tom 教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体
上有成千上万个碱基对,它们从 0 开始编号,到几百万,几千万,甚至上亿。比如说,在对学生讲解
第 1234567009 号位置上的碱基时,光看着数字是很难准确的念出来的。所以,他迫切地需要一个系
统,然后当他输入 12 3456 7009 时,会给出相应的念法:十二亿三千四百五十六万七千零九
用汉语拼音表示为 shi er yi san qian si bai wu shi liu wan qi qian ling jiu。这样他只需要照着念就可
以了。你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为
汉语拼音字串,相邻的两个音节用一个空格符格开。注意必须严格按照规范,比如说“10010”读作
“yi wan ling yi shi”而不是“yi wan ling shi” , “100000”读作“shi wan”而不是“yi shi wan” , “2000”
读作“er qian”而不是“liang qian” 。
输入格式:有一个数字串,数值大小不超过 2,000,000,000。
输出格式:是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
样例输入
1234567009
样例输出

shi er yi san qian si bai wu shi liu wan qi qian ling jiu


//**********************数的读法 #include <iostream>#include <queue>#include <stack>#include <string.h>using namespace std;const string s[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};void shu_de_du_fa(queue<string> *q, int n){if(n<10){q->push(s[n]);}else if(n<100&&n>=10)         //两位数 {if(n/10==1&&n%10!=0){q->push("shi"); q->push(s[n%10]);   }else if(n/10==1&&n%10==0){q->push(s[n/10]); q->push("shi");}else if(n/10!=1&&n%10==0){q->push(s[n/10]); q->push("shi");}else if(n/10!=1&&n%10!=0){q->push(s[n/10]); q->push("shi"); q->push(s[n%10]);}}else if(n<1000&&n>=100)      //三位数 {q->push(s[n/100]); q->push("bai");if(n%100>=10){if(n%10==0){q->push(s[(n%100)/10]); q->push("shi");}if(n%10!=0){q->push(s[(n%100)/10]); q->push("shi"); q->push(s[n%10]);}}else if(n%100<10){if(n%10!=0){q->push("ling"); q->push(s[n%10]);}}}else                         //四位数 {q->push(s[n/1000]); q->push("qian");if(n%1000>=100){q->push(s[(n%1000)/100]); q->push("bai");if(n%100>=10){if(n%10==0){q->push(s[(n%100)/10]); q->push("shi");}if(n%10!=0){q->push(s[(n%100)/10]); q->push("shi"); q->push(s[n%10]);}}else if(n%100<10){if(n%10!=0){q->push("ling"); q->push(s[n%10]);}}}else if(n%1000<100&&n%1000>=10){q->push("ling"); q->push(s[(n%100)/10]); q->push("shi");if(n%10!=0)q->push(s[n%10]);}else if(n%1000<10){if(n%10!=0){q->push("ling"); q->push(s[n%10]);}}}}void showout(queue<string> *q){while(!q->empty()){cout << q->front() << " "; q->pop();}}int main(){long l; stack<int> s;cin >> l;if(l==0)  cout << "ling";else{while(l>0){s.push(l%10000);l=l/10000;}if(s.size()==1){queue<string> q;shu_de_du_fa(&q,s.top()); s.pop();showout(&q);}else if(s.size()==2){queue<string> q1, q2;shu_de_du_fa(&q1,s.top()); s.pop();shu_de_du_fa(&q2,s.top());if(s.top()!=0){if(s.top()<1000){showout(&q1); cout << "wan " << "ling "; showout(&q2);}else{showout(&q1); cout << "wan "; showout(&q2);}}else{showout(&q1); cout << "wan";}s.pop();}else if(s.size()==3){int x[3], i=0;while(!s.empty()){  x[i]=s.top(); s.pop(); i++;}queue<string> q1, q2, q3;shu_de_du_fa(&q1,x[0]); shu_de_du_fa(&q2,x[1]); shu_de_du_fa(&q3,x[2]);if(x[1]<1000){showout(&q1); cout << "yi ";if(x[1]!=0){cout << "ling "; showout(&q2); cout << "wan ";if(x[2]<1000){if(x[2]!=0){  cout << "ling "; showout(&q3);}}else{showout(&q3);}}if(x[1]==0){if(x[2]!=0){cout << "ling "; showout(&q3);}}}else{if(x[2]<1000){showout(&q1); cout << "yi "; showout(&q2); cout << "wan ling "; showout(&q3);}else{showout(&q1); cout << "yi "; showout(&q2); cout << "wan "; showout(&q3);}}}}return 0;}


0 0