首页 > 学院 > 开发设计 > 正文

基础练习 数的读法

2019-11-08 02:46:50
字体:
来源:转载
供稿:网友

问题描述  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<fstream>  #include<string>  #include<cstring>  #include<algorithm>  #include<sstream>  using namespace std;    string table[11]={"ling ","yi ","er ","san ","si ","wu ","liu ","qi ","ba ","jiu "};  string table2[4]={"qian ","bai ","shi "};  int flag=1;  string change(string s)  {      int i,index=0;          string result="";      char ss[4]="";      //过滤无效的前导0      for(i=0;i<s.length()&&s[i]=='0';i++);          for(;i<s.length();i++)          ss[index++]=s[i];      ss[index]='/0';  	    int length=strlen(ss);  	    //记录后导0      int record=0;      for(i=length-1;i>=0;i--)          if(ss[i]=='0')              record++;          else               break;      if(record>0)          flag=0;      int k=4-length;          //2位含十的有点特殊  	if(length < s.length() && length!=0)		cout<<"ling ";    if(length==2)      {          if(ss[0]=='1' && ss[1]=='0')              return "yi shi ";          if(ss[0]=='1'  && ss[1]!='0')              return "shi "+table[ss[1]-'0'];          if(ss[0]!='1' && ss[1]=='0')              return table[ss[0]-'0']+"shi ";          if(ss[0]!='1' && ss[1]!='0')              return table[ss[0]-'0']+"shi "+table[ss[1]-'0'];      }        for(i=0;i<length-record;i++,k++)      {          if(ss[i]!='0')          {              result+=table[ss[i]-'0']+table2[k];          }          else if(i!=0 && ss[i]!=ss[i-1])              result+="ling ";      }      return result;  }    int main()  {       string data="";      string s1="",s2="";            while(cin>>data)      {          int pos=data.find('.');          if(pos!=string::npos)          {              s1=data.substr(0,pos);              s2=data.substr(pos+1);          }          else          {              s1=data;          }          if(s1.length()>8)          {              string temp1=s1.substr(0,s1.length()-8);              s1=s1.substr(s1.length()-8,s1.length());              string result1=change(temp1);              if(result1.length()!=0)                  cout<<result1<<"yi ";          }          if(s1.length()>4)          {              string temp2=s1.substr(0,s1.length()-4);              s1=s1.substr(s1.length()-4,s1.length());              string result2=change(temp2);              if(result2.length()!=0)                  cout<<result2<<"wan ";          }          if(s1.length()>0)          {              string result3=change(s1);              if(result3.length()!=0)                  cout<<result3<<" ";          }          if(s2.length()==0 || (s2[0]=='0' && s2[1]=='0') )              cout<<" "<<endl;          else          {              if(s2[0]=='0'&&s2[1]!='0')              {                  cout<<table[s2[1]-'0']<<" "<<endl;                  continue;              }              if(s2[0]!='0'&&s2[1]=='0')              {                  cout<<table[s2[0]-'0']<<" "<<endl;                  continue;              }              if(s2[0]!='0'&&s2[1]!='0')              {                  cout<<table[s2[0]-'0']<<" "<<table[s2[1]-'0']<<" "<<endl;              }          }      }            return 0;  }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表