程序员数学基础【七、等比数列 棋盘麦粒】

题干:


根据历史传说记载,国际象棋起源于古印度,相传国王要奖赏国际象棋的发明者,问他想要什么,发明者说:请您在棋盘的第一个格子里放1粒麦子,第二个格子里放2粒,第三个格子里放4粒,第四个格子里放8粒,以此类推,直到最后一个格子,第64格放满为止。


赏给我这么多数目的麦粒,我就十分满足了.国王觉得这个要求不高,就欣然同意了. 然而等到麦子成熟时,国王才发现,全印度的麦子竟然连棋盘一半的格子数目都填不满.  




程序员数学基础【七、等比数列 棋盘麦粒】




现在我们来帮助国王计算一下,想要填满64格棋盘,到底需要多少麦粒。实际上这是一个等比数列求和问题。棋盘的第一格只需要麦粒a1=1,第二个需要麦粒a2=2,第3格a3=4,等等,这些麦粒的数量构成一个首项a1=1,公比q=2的等比数列。那么要求64格棋盘的总麦粒数。


程序员数学基础【七、等比数列 棋盘麦粒】


程序员数学基础【七、等比数列 棋盘麦粒】


再观察对比这两个等式,发现它们有很多相同的指数幂,所以可以把两个等式相减来化简,我们用2式减1式,等号左边相减,2S64-S64,等号右边相减,这些相同的指数幂会消掉,最后留下来的,只有2^64,减去1.所以能得到棋盘上的总麦粒数S64,等于264-1,这是一个天文数字,相当于全世界2000年的小麦产量。


【Python暴力解法】


#定义一个变量来保存总的麦子数量,开始为0
c=0
#定义一个变量,循环1-64,来代表每一个格子
i=1
#假设每个格子中的麦子数量为x,初始也是1
x=1
#循环
while i<=64:
    c += x    #总数累计上这一个格子的麦粒数
    i += 1    #下一个格子
    x = x*2   #下一个格子的麦粒数是这一个格子的2倍
#显示结果
print("64个格子,总的麦粒数量为:",c)


程序员数学基础【七、等比数列 棋盘麦粒】


上面计算麦粒的方法,对任何一个q不等于1的等比数列求和,都是适用的。等比数列的前n项和Sn,=a1+a2+...+an,我们用a1和q来表示。


程序员数学基础【七、等比数列 棋盘麦粒】


错位相减法不仅适合于等比数列的求和,更多的时候,如果一个数列的通项形式,可以表示成,一个等差数列与一个等比数列的乘积时,那么都可以用错位相减法来求前n项和。至于等比数列想要求和,只要直接套公式就可以。


程序员数学基础【七、等比数列 棋盘麦粒】


远望巍巍塔七层,红光点点倍加增,共灯三百八十一,请问尖头几盏灯?”意思是:一座7层塔共挂了381盏灯,且相邻两层中,下一层灯数是上一层灯数的2倍,则塔的顶层共有几盏灯?


每层塔所挂的灯的数量形成一个等比数列,公比q=2,我们设塔的顶层有a1盏灯。7层塔一共挂了381盏灯,S7=381,按照等比求和公式,  那么有a1乘以1-2的7次方,除以1-2,等于381.能解出a1等于3.  尖头必有3盏灯。


上一篇:后端程序员必备的Linux基础知识


下一篇:[WCF权限控制]基于Windows用户组的授权方式[下篇]