蓝桥杯 数的读法 C语言

基础练习 数的读法
/*题目: 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 */
1.首先来谈一下本人刚开始的思路。刚开始做这个题目时,想的是4个数一组,按数的最高位不同编写了好个函数,然后嵌套调用,这个方法虽然是可行的,但是太复杂需要考虑很多东西,讨论很多种情况,试一两组数据根本就试不出错误,而且程序非常的长,我打了将近200行!!!心累。下面的程序是本人在又一次的认真学习,思考后打的自认为叫容易理解的。若有不妥之处,烦请教正!
2.分析一下本题:我感觉这题有三个难点:第一个就是题目上有特别说明的yi shi和shi的问题,在编写程序时,要弄明白哪种地方需要用哪种说法。第二个就是怎样知道这个数应该读的是哪位。第三个就是“消零”的问题,那些地方的零需要读出来,哪些地方的0不需要读出来(比如:30007009读作sai qian wan qi qian ling jiu,30087009读作san qian ling ba wan qi qian ling jiu)这个看起来很简单,但是写的是很容易忽略这个问题的。

 #include <string.h>
int main() { 
 char a[100]; 
//将数的英文读法写进数组里,这样容易读取,比如数字为3,读b[3]就可以直接获得san 
char b[13][100]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu","shi"}; 
//题目中有规定数的范围,最多只能十位,用1234567009为例,从后往前每个数读的时候位数依次为个,十,百,千,万,十,百,千,亿,十因为个不需要读出来,所以就不需要填写东西,但是位置还是要保留的 
char c[12][100]={"","shi","bai","qian","wan","shi","bai","qian","yi","shi"};
 int i,j,s[20],l;
  //(这个语句可以在看完整个程序后再思考,可以自己试着将这条语句删除,观察运行结果的变化,10010)这个给最后一位数赋0的操作,是因为当最后一位数是0时,程序总是将ling读出来,试了很多办法都没有用,没办法就这样来给if判断,需要说明的是我虽然加了个0,但是并没有改变数的最高位由于l,i,j的限制。若想到更好的改进方法,希望不吝赐教!
  s[i]=0; 
 l=strlen(a);
 //位数i从高到低,数j从第一个开始读起
for(i=l-1,j=0;i>=0,j<l;i--,j++) 
 { //10010 yi wan ling yi shi 
//该语句的作用就是区分1的读法,读shi的开头都是最高位为wan或yi的,并且都是两位如**12**34007009,
 if(i==5&&j==0||i==9&&j==0) 
     { if(s[j+1]==0) //100010 shi wan ling yi shi 
                printf("shi %s ",c[i-1]);
                 else //120010 shi er wan ling yi shi
         printf("shi "); } 
  if(i==4&&s[j]==0) 
   { if(s[j-1]!=0||s[j-2]!=0||s[j-3]!='0') 
                printf("wan "); 
             printf("ling "); 
   if(s[j]==0&&s[j+1]!=0)
     { printf("ling "); 
       continue; } 
        if(s[j]==0&&s[j+1]==0) 
           continue; 
 printf("%s ",b[s[j]]); 
} 
return 0; }

以上即本人的程序及注释,标注释的地方都是本人在编程序时觉的比较难理解的地方,若有觉啰嗦,请见谅啊(#.#) 欢迎指正!!⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
这是本人写的第一篇博客,不太会弄,写完自己看排版都觉得很奇怪哈哈~

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值