《程序员的算法趣题》-(日)增井敏克 Python解题 -- (Q16)

《程序员的算法趣题》-(日)增井敏克 , 书中为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种组合

猜你喜欢

转载自blog.csdn.net/cloudly89/article/details/84797394