《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q18)
阿新 • • 發佈:2018-12-14
《程式設計師的演算法趣題》-(日)增井敏克 , 書中為69 道數學謎題編寫了解題程式, 程式語言為:Ruby,JavaScript,C語言。有興趣的同學,可以購書閱讀~
在此更新個人編寫的Python版,僅供學習使用。(執行環境:Python3.6)
Q18 水果酥餅日
日本每月的 22 日是水果酥餅日。因為看日曆的時候, 22 日的上方剛好是 15 日,也就是“‘22’這個數字上面點綴著草莓”(如果將日語的 15 拆為 1 和 5 發音,則與日語“草莓”一詞發音相同,而水果酥餅中最為著名的就是草莓酥餅。)
切分酥餅的時候,要求切分後每一塊上面的草莓個數都不相同。假設切分出來的 N 塊酥餅上要各有“1~N 個(共 N(N + 1)÷2 個草莓)”。但這裡要追加一個條件,那就是“一定要使相鄰的兩塊酥餅上的數字之和是平方數”。
舉個例子,假設 N = 4 時採用如 圖的切法。這時,雖然 1 + 3 =4 得到的是平方數,但“1 和 4” “2和 3” “2 和 4”的部分都不滿足條件。
問題
求可以使切法滿足條件的最小的 N(N > 1)。
import math def check_cake_list(start_cake, use_list, sqrt_list): for index, number in enumerate(use_list): if (start_cake + number) in sqrt_list: res_cakes = use_list[:index] + use_list[index+1:] if len(res_cakes) == 0: if (number + 1) in sqrt_list: return True if check_cake_list(number, res_cakes, sqrt_list): return True return False N = 2 while True: cake_list = [i for i in range(2, N+1)] sqrt_numbers = [i*i for i in range(1, int(math.sqrt(N*2))+2)] if check_cake_list(1, cake_list, sqrt_numbers): break N += 1 print("最小的N為:%s" % N)
執行結果:
最小的N為:32