《程序员的算法趣题》-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言。有兴趣的同学,可以购书阅读~
在此更新个人编写的Python版,仅供学习使用。(运行环境:Python3.6)
Q16 3 根绳子折成四边形
假设分别将 3 根长度相同的绳子摆成 3 个四边形。其中 2 根摆成长方形,剩下 1 根摆成正方形。这时,会出现 2 个长方形的面积之和等于正方形面积的情况(假设长方形和正方形的各边长都为整数)。
例) 绳子长度为20时,可以折出以下这些正方形和长方形。
第 1 根 长 1× 宽 9 的长方形 → 面积= 9
第 2 根 长 2× 宽 8 的长方形 → 面积= 16
第 3 根 长 5× 宽 5 的正方形 → 面积= 25
进一步改变绳子长度并摆成长方形和正方形,统计满足条件的长方形和正方形的组合。这里,将同比整数倍的结果看作同一种解法。
例) 绳子长度为40, 60, …时,可以通过对上例进行等比运算得出以下这些正方形和长方形的组合,但要将它们看作同一种解法,所以这一类只统计为1种。
● 绳子长度= 40
第 1 根 长 2× 宽 18 的长方形 → 面积= 36
第 2 根 长 4× 宽 16 的长方形 → 面积= 64
第 3 根 长 10× 宽 10 的正方形 → 面积= 100
● 绳子长度= 60
第 1 根 长 3× 宽 27 的长方形 → 面积= 81
第 2 根 长 6× 宽 24 的长方形 → 面积= 144
第 3 根 长 15× 宽 15 的正方形 → 面积= 225
问题
求绳子长度从 1 增长到 500 时,共有多少种组合能使摆出的 2 个长方形面积之和等于正方形的面积?
ratio_list = set()
for square_side in range(1, int(500/4)+1):
square_area = square_side * square_side
rectangle_area_list = []
for rectangle_line in range(1, square_side):
rectangle_area_list.append(rectangle_line * (square_side*2-rectangle_line))
while len(rectangle_area_list) > 1:
rectangle_area = rectangle_area_list.pop()
another_area = square_area - rectangle_area
if another_area in rectangle_area_list:
rectangle_area_list.remove(another_area)
ratio_list.add((rectangle_area/square_area, another_area/square_area))
print("共有%s种组合" % len(ratio_list))
运行结果:
共有20种组合