数的读法

问题描述: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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gabanon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值