2. 6第六回 芬奇 “蛋”千年迷坑,阿兰 “唤”芝麻开门

上一节说到古代中国著名数学家祖冲之先生留心生活,最终以发现圆周率而名垂青史,而在祖老先生死去将近一千年后,在欧洲出现了著名的文艺复兴运动,这期间也有一位有名的人物以圈圈而得名,他不是跑圈,而是画鸡蛋,他就是达•芬奇。达芬奇画圈最终的目的是做画,直到现在,他的名画蒙娜丽莎还用那迷人的微笑盯着世人,迷人的微笑背后,有许多故事等着人们破解,千百年来,无数仁人志士更是乐此不疲。
本回的重点是,在数字中来游戏,数字的妙处在这里,寓乐于数。

2.6.1 P6蒙娜丽莎的微笑
enter image description here

图2.6.1 达•芬奇和他迷人微笑

 列奥纳多•达•芬奇(Leonardo da Vinci,1452-1519),意大利文艺复新时期最负盛名的艺术大师,科学家。他生于佛罗伦萨郊区的芬奇镇,卒于法国。达•芬奇是人类智慧的象征,他怀有神灵般的无限理想,试图重新创造世界的美,量度世界的广大无垠,解释世界的奥秘。可是他只有常人的生命和力量。他的抱负是发现一切、研究一切、创造一切。他的生命是一条没有走完的道路,路上撒满了崇高的未完成作品的零章碎片,他在临终前心酸地说:“我一生从未完成一项工作。”
据说,法国著名的卢浮宫有三件宝:一是《米洛斯的阿芙罗狄德》;二是《萨莫色雷斯的胜利女神》;三是《蒙娜丽莎》。前两件作品出于谁人之手一般人并不确知,但是,《蒙娜丽莎》出自意大利文艺复兴时期的达•芬奇却几乎家喻户晓。“蒙娜丽莎”那神奇而专注的目光,那柔润而微红的面颊,那由内心牵动着的双唇,那含蓄、模棱两可的微笑,总让人琢磨不透……
她为什么微笑呢,他笑什么呢,她究竟是谁呢,和达•芬奇关系如何呢,她的年龄有多大呢?问题越来越多,关于这幅画和达•芬奇的故事也越来越多。
其实,在达•芬奇的出生年代里蕴藏着一个秘密,蒙娜丽莎的年龄,前两个数位的差和后两个数位的差,组成了她的芳龄。我们的问题是:你能用电脑算出蒙娜丽莎的年龄吗?

2.6.2 五步积木法解题:

第一步:三积木
这是最简陋的一个图形(如图1),也是最基本的一步。

enter image description here

图1

enter image description here

图2

第二步:做头尾

上面的三部分,先分析开头和结尾部分,开头是什么呢?题中的已知可输入条件,也就是达•芬奇的出生年代。结尾是什么呢?本题中要求得的一个结果,即蒙娜丽莎的年龄。

enter image description here

图3
enter image description here
图4

第三步:连头尾
如何将开头和结尾连接起来呢?也就是ageL和ageM的关系,直接联系不上,必须再行分解,因为有关系的是ageL的四个位和ageM的两个位,所以中间处理部分可分解成两部分,一是据ageL求出四个位n1-n4,后面则是据n1-n4求出ageM的两个位(图3)。下面一部分一部分地来,先求第一部分:
怎样求呢?一眼就能看出来n1=1,n2=4,n3=5,n4=2,但直接用眼看显然还不行,还要想想用个什么公式。先看看n1和1452之间有什么关系吗?首先要取得其中的第一个位,怎样才能得到第一个位呢?可以先将1452/1000,但得到的是个小数1.452,我们要的是整数,只要将小数部分舍去就行了,所以可以通过下面的公式实现n1=int(ageL/1000)。那第二个呢?如果只有三位,方法和求n1一样;怎样得到三位数呢?因为求出了n1,可以利用n1,只要将1452-n1*1000就得到了,公式也就有了:n2=int((agel-1000*n1)/100),后面两个也就简单了。

再求第二部分:
有了四个位上的数n1-n4,ageM的两个位也就有了,m1=n2-n1,m2=n3-n4,这样,ageM就有了,只要将两个位m1,m2组合到一起就OK,ageM=m1*10+m2(如图4所示)。

第四步:贴语法

下面我们还用QBASIC语言来解这个题目,其实和第一种本质上是一样的。第三步图中的各个语句和具体语言的语法还有一定的差距,根据相应语言,还要再行将相应语句转化。本题中主要是输入和输出,再就是中间的部分内容,由于公式较长,非常容易出错,需特别注意(如图5示)。

enter image description here

图5

第五步:写代码

下面可以写代码了,但问题是在Scratch中没有int()这样一个函数来表示取整,其中有一个是取余数的,所以还需要从取整数变换成取余数。基本的将一个大数拆分成各个位的方法是不变的,要变的是如何拆的工具。 1452拆出千位1来,可以用这个数本身1452减去452,得到1000,然后除以1000得到,452怎么来的,正好是1452除以1000的余数。而拆第二个位时,即1452中的4时,其方法和上面差不多,需要先得到400,而1452除以1000的余数是452,如何得400,再减去52就有了,52则是1452除以100之后的余数。两个余数相减,得到了数位。有了第二位的经验,第三位也就有了,第四位也有了,因为第四位是最后一位,其实可以更简洁。
enter image description here

图2.6.2 Scratch积木代码

2.6.3 阿兰开讲

程序演义到现在,还象儿时的达芬奇在画蛋,祖冲之在跑圈,直到现在,我们遇到的所有编程故事,简单到令人不齿的地步,脑子不需拐弯竟然能将题目做出?!这些就是我们生活中常用到的问题,顺序类问题!也正是重复跑圈的意义所在,正是这种重复的一个个圈,最终铸就了科学和文艺的大师。而我们什么时候才能从圈圈中跑出来呢?
达芬奇画蛋,祖冲之跑圈,看似风牛马不相及的东西跑到了一起,最终却都成就了一代宗师,真是英雄所见略同啊!无数次的重复过后,见证了两位大师的心路历程。先有简单,才有复杂;先不会拐弯,才会越来越转变。
阿兰告诉大家的是:是什么促使我们去解开更多的历史事件真相呢?从蒙娜丽莎的身上,我们不难发现,是对于美的追求,更是一种好奇心!编程亦然,生活中有许多有价值的东西等着你去发现呢!
这种美,有时候更是一个线索,是我们发现更复杂问题的线索,蒙娜丽莎微笑背后的故事也许正是它!
后面我们还将奉献上这样一些有意思的题目,欲知后事如何,且听下节分解。

2.6.4 小测验
哥伦布水杯的第三种解法
哥伦布在发现新大陆后,在庆功宴上提出了一个问题,将桌上的两杯水给从另外一杯子中换过来,他的办法是找来第三只杯子,现在如果让我们通过电脑解题,而又不允许使用第三只杯子,该如何是好呢?

小测验参考答案:

我们重新审视P1哥伦布水杯问题时,不难发现第三种解法!用电脑解题,完全可以扔掉第三只杯子! 最重要的三句代码如下:

a=a+b
b=a-b
a=a-b