基础练习 数的读法
时间限制:1.0s 内存限制:512.0MB
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。
是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
分析:
这一题要注意的小细节特别多。最好的办法是把字符窜四个四个一块处理。
#include <iostream>
#include <string>
#include <cstring>
#include <stdlib.h>
using namespace std;
string s[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string unit[4]={"","shi","bai","qian"};
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
string change(string s11){
int tle=s11.length();
string temp="";
for(int i=0;i<tle;i++) {
char* tt=new char[2];
strcpy(tt,s11.substr(i,1).c_str());
if(unit[tle-i-1].empty())
{
temp=temp+s[atoi(tt)]+" ";
}
else
{
if(atoi(tt)==0&&i!=tle-2) continue;
if(atoi(tt)==0) temp=temp+s[atoi(tt)]+" ";
else temp=temp+s[atoi(tt)]+" "+unit[tle-i-1]+" ";
}
}
return temp;
}
int main(int argc, char *argv[]) {
string text="";
cin>>text;
int length=text.length();
int fenpian=length/4;
if(fenpian==0||length==4){
cout<<change(text);
}
if((fenpian==1&&length>4)||length==8){
string str1=text.substr(length-4,4);
string str2=text.substr(0,length-4);
cout<<change(str2)<<"wan "<<change(str1);
}
if((fenpian==2&&length>8)||length==12){
string str1=text.substr(length-4,4);
string str2=text.substr(length-8,4);
string str3=text.substr(0,length-8);
cout<<change(str3)<<"yi ";
cout<<change(str2)<<"wan ";
cout<<change(str1);
}
return 0;
}