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 #include<iostream>
2 using namespace std;
3 char num[20][20]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu","shi"};
4 void trans(int x,int y,int z){
5 int flag=0;
6 int a=x/1000;//把各个位都取出来
7 int b=x%1000/100;
8 int c=x%100/10;
9 int d=x%10;
10 if(a){//如果千位存在,
11 printf("%s ",num[a]);
12 printf("qian ");
13 }
14 else if(y>z){//如果千位不存在,并且这四位不是最高的四位
15 printf("ling ");//才输出零
16 }
17 if(b){//如果百位存在
18 printf("%s ",num[b]);
19 printf("bai ");
20 }
21 else if(a&&c||a&&d){//如果百位存在,
22 //并且千位和十位同时存在或者千位和个位同时存在
23 printf("ling ");//那么就输出零,
24 flag=1;//如果输出零的话,就标记一下,防止连续输出俩个零
25 }
26 if(c){//如果十位存在,
27 if(y!=z||(y==z&&c!=1))//并且这四位不是最高的四位,
28 //或者是最高的四位的话,那么十位的数不能是1
//又或者是最高的四位,十位的数又是1,那么千位和百位必须得有一个存在
29 printf("%s ",num[c]);
30 printf("shi ");
31 }
32 else if((a||b)&&d){//如果十位没有数,并且千位或者百位有一个与个位同时存在
33 if(!flag)//就输出零,但如果标记了的话,就不输出了
34 //防止同时输出两个零
35 printf("ling ");
36 }
37 if(d){
38 printf("%s ",num[d]);
39 }
40 }
41 int main(){
42 int n;
43 scanf("%d",&n);
44 int yi=n/100000000;//把这个数分成三段
45 int wan=n%100000000/10000;
46 int ge=n%10000;
47 int d;//d用来存储哪块才是最高的一块
48 if(yi){
49 d=1;
50 }
51 else if(wan){
52 d=2;
53 }
54 else if(ge){
55 d=3;
56 }
57 //然后分着处理
58 if(yi){
59 trans(yi,1,d);
60 printf("yi ");
61 }
62 if(wan){
63 trans(wan,2,d);
64 printf("wan ");
65 }
66 else if(yi){
67 printf("ling ");
68 }
69 if(ge){
70 trans(ge,3,d);
71 }
72 return 0;
73 }
我反正觉得这题很恶心,可能由于心情的原因,写出来后自闭了一天
这道题有个要命的地方,即便你的代码有漏洞,也能通过oj!!!
我觉得我现在这代码应该挺全面了,但可能也许会有错误
主要思想就是把这个要处理的数分成三部分,因为这个数小于20亿,所以直接用int来存储就行
怎么个三部分呢,
比如说 1234567899
第一部分(代码里叫yi) 12
第二部分(代码里叫wan) 3456
第三部分(代码里叫ge) 7899
所以这个就是12亿3456万7899
代码里用d存储最高的部分
1 if(yi){
2 d=1;
3 }
4 else if(wan){
5 d=2;
6 }
7 else if(ge){
8 d=3;
9 }
什么意思呢
比如说这个,1234567899 的yi部分存在,它的d就是1,也就是我们要先输出它的yi部分
如果这个数是10010, 它的wan部分存在,它的d就是2,也就是我们要先输出他的wan部分
就这个意思
为什么这样做呢
因为题目中说12亿要说十二亿而不能说一十二亿,不能说出一
但如果是212,这个就要说二百一十二,得说出一
也就是说这个12在最前面的话,就不能说出一,在后面的话,就得说出一
所以我们有必要知道现在要输出的这个数在整体的位置
然后每个部分都分出来后,又要用到一个函数trans
这个函数就是处理每个部分里的读音
传进这个trans函数的数最多有四位,
又把每一位都分离开来,用a b c d来存储
然后有各种各样的牵制关系,我这个代码里好像写的很乱。。。。。。
没办法,我的这个做法不是太好,我也懒得去看别人的了
貌似没有特别简便的算法了
就这样吧
O(∩_∩)O
原文:https://www.cnblogs.com/fate-/p/12287383.html