首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

电脑数学家

十年来的第一场大雪,整个苏州城都笼罩在一片银装素裹之中,小八的学校也因此而停课了一个星期。但在这段时间里,小八并没有停止对编程的思考。

首先,告诉大家一个好消息:小八又重新开始讲解scratch啦!在好几期python文本所带来的头脑冲击后,又再次可以见到熟悉的彩色积木了!(虽然看起来还是眼花缭乱的^_^)

小八在书架上偶然翻出了一本讲解scratch的书,在最后一章的附加信息中看见了一个编程实例——将阿拉伯数字转化成英文表述,比如“98”,小猫会说出:“ninty eight”。这一直适用于所有在12位以内的数字。

于是,小八大脑里马上闪出一个念头:用汉语来翻译数字。但马上思索一番后,小八发现汉语翻译和英语翻译有着很大的不同,其中最重要的问题是0到底是读还是不读(这涉及到0是在末尾还是在中间)以及如何让电脑判断多个0叠在一起仍然只读一个0。

最终,小八利用了几天时间,想通了这些问题的答案。所以大家可以先不看下文,自己思考思考,到底该如何实现汉语翻译数字。没有思绪?那就想想小学时候数学老师是用什么方法来教学生读阿拉伯数字的。这其实也是一种简单的人工智能,说穿了就是让电脑也拥有和人类一样的思考方式。而实现这一功能最基础的方法就是研究它的算法,去寻找其中蕴含的规律性(即找出一个“通项公式”)。比如说教电脑下五子棋,或者让电脑玩吃豆人,这都是人工智能的一种形式。

想出来了没有?就算没有也不要紧,因为这还是比较难理解的。也许你平时大脑里思考一样事物只需要一刹那,但回过去想这样事物的规律就会很难,这和福尔摩斯探案非常相似。

好了,下面小八就把这“数字翻译家”的全代码展示给大家(我这次使用了高大尚的scratch2!)——

看不清?没关系,小八会一步步给大家讲解,带着大家了解程序的构造。

在开始之前,我们要设定一些基础参数(即变量和链表):

第一步,我们通过询问来将得到的回答存入“处理的数字”中,以便方便地阅读和理解程序。接着,我们要通过循环语句来得到三个带有“循环”二字的变量。这是用来存储数字块儿的位数的,代表了待会儿判断的次数,这样就不用每一次重新编写了,这是编程的一种聪明方法。(下面是具体的谍照:)

接着我们将数字分成个级、万级和亿级三块,并分别存入三个链表中(这需要配合变量“移入链表”来确定转入字符串的具体第几个字符)。

导入完毕后,我们已经拥有了三个链表,并且每个链表里有三个级别的数字组,每一项为一个数字。那么接下来怎么做呢?

还记得刚刚探讨过的问题吗,就是关于0读和不读的规律。小八可以提前告诉大家:末尾的0一律不读,中间的0统统只读一个。而末尾0的判断关系到等会儿汉字处理的定义,所以我们使用三个变量“除零”来将末尾0的循环排除掉(比如数“9800”,得出的“个位循环”为4,但末尾有两个0,所以通过判断得出“末尾除零”为2,即末尾有两个0,所以等会儿翻译的时候只要翻译4-2=2次就行了,后面的0直接忽略---)

现在,我们首当其冲的任务是如何处理数字对应的汉字。这没有什么聪明办法,只能用累赘而长段的if语句来实现——

而至于“十百千”名称,我们用“身份”自定义来编写(以个位为例)——

最重要的是0是没有任何冠名的,所以要将0排除。

在三个级的答案准备就绪后,还要判断某个级是否不含数字。如果不含(即没有足够大),就没有任何冠名。

哦,差点忘了,如果现在运行此程序,会发现当回答为0时,小猫会什么都说不出。因此在开头,我们用一个if_else语句判断回答是否为0,如果是0,就直接跳过所有的语句,说出“零”。

最后,我们将“最后的答案”赋值为三个级别答案的连接,然后让小猫说出“这个数是:---”。大功告成!

厉害吧!!!

(不过,现在电脑数学家只认识小于等于12位的阿拉伯数字,更大的数就会胡言乱语。小八相信一定可以在不久的将来修复这个bug!)

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180127G0BL4R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券