记一道评论区的题目
导语 : 作为一个西电的菜鸡 , 每天只能和不超过两天的ddl较劲 , 啥也不懂 , 啥也不会. 因为家里硬盘不太够了所以把作业的代码传到博客里保存. 可以预见到的 , 遭到了真正大佬的嘲笑. 其中 , 二哥在讨论区里留下一道题目 , 我觉得还挺有意思的. 所以试着实现了一下 , 作为博客的第二篇拙作.
1.题目
分析一下 , 是想实现一个小写数字到中文大写数字的转化. 那么 , 如果我们想要实现这个功能 , 首先我们要重新回顾一下中文数字的读法和英文读法的区别.
2.回顾背后的数学知识
我们在小学二年级的时候就学过数字的读法 , 在初中的时候基本上了解到了英文的数字的读法.
比如对于31980 , 中文读作"三万一千九百八十" , 英文读作"tirty-one thousand and nine hundred eighty". 那么中文和英文对于数字的读法来说有什么不同呢?
首先 , 我们要了解一下中文和英文当中对于数字的单位. 在中文中 , 有个 , 十 , 百 , 千 , 万 , 十万 , 百万 , 千万 , 亿 , 十亿… 在英文中 , 有1-20的不同的读法 , x0的读法 , hundred , thousand , million , billion… 通过比较我们不难发现其规律. 中文的数字单位是以四个为一循环 , 比如四位引出一个万 , 再四位引出一个亿. 而英语中是以三位为一个计数段 , 引出一个定义的单位.
1 , 000 , 000 , 000 1,000,000,000 1,000,000,000
10 , 0000 , 0000 10,0000,0000 10,0000,0000
两者相似的 , 对于比较小的位数划分的比较详细一些 , 而对于比较大的位数 , 中国人采取与小位数的单位相结合同时适度引入新单位来记录数字 , 而英语采用每三位定义一个单位的方式记录数字.
对于中文来说 , 比较特殊的一点是 , 如果在数的中间有0的话习惯中间读一个"零"表示区分层次.
如 : 1023读作"一千零二十三" , 但是如果从某一位开始之后全是0的情况下则不读这个0. 而这个"零"的读法便是这个小demo最有意思的地方.
3.程序设计和算法思路
通过上面对问题的回顾 , 我们大致可以想到一个思路. 将一个数字按4位为一组分隔开. 将0-9999的数实现向中文的转换 , 然后在后面加上单位即可. 比如12345 , 可以看作1,2345 , 那么第一组2345就读作"二千三百四十五" , 这里为了叙述方便 , 将中文大写数字"壹"写作了中文小写数字"一". 这一组因为最低位是个位 , 所以单位为空. 而第二组只有一个1 , 读作"一" , 它处于万位上. 所以后面加上单位"万". 所以读作"一万二千三百四十五".
下面主要讨论如何将0-9999内的数字实现. 很自然的 , 我们想到模拟人来读数字的方法. 首先,我们将所读数的千位 , 百位 , 十位 , 个位存在一个整型数组里.
下 面 列 出 需 要 讨 论 的 几 种 情 况 : 1234 1 , 2 , 3 , 4 1 0 , 0 , 0 , 1 1001 1 , 0 , 0 , 1 1000 1 , 0 , 0 , 0 1110 1 , 1 , 1 , 0 0 0 , 0 , 0 , 0 下面列出需要讨论的几种情况:\\ 1234\\ 1,2,3,4\\ 1\\ 0,0,0,1\\ 1001\\ 1,0,0,1\\ 1000\\ 1,0,0,0\\ 1110\\ 1,1,1,0\\ 0\\ 0,0,0,0 下面列出需要讨论的几种情况:12341,2,3,410,0,0,110011,0,0,110001,0,0,