问题描述: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
样例输出
上有成千上万个碱基对,它们从 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;
}