Project Euler 033
49/98は面白い分数である.「分子と分母からそれぞれ9を取り除くと, 49/98 = 4/8 となり, 簡単な形にすることができる」と経験の浅い数学者が誤って思い込んでしまうかもしれないからである. (方法は正しくないが,49/98の場合にはたまたま正しい約分になってしまう.)
我々は 30/50 = 3/5 のようなタイプは自明な例だとする.
このような分数のうち, 1より小さく分子・分母がともに2桁の数になるような自明でないものは, 4個ある.
その4個の分数の積が約分された形で与えられたとき, 分母の値を答えよ.
->次の問題
考え方
総当りで力づくしか思いつきませんでした…
itertoolsのproductを使い、denominator, numerator, add_numそれぞれに1~9まで順番に組み合わせを試しています。
if文にはORを使い全ての組み合わせをゴリゴリに書いています。
ウツクシクナイ
コード
euler033.py
from itertools import product
from math import gcd
def main():
answer_numerator = 1
answer_denominator = 1
for numerator, denominator, add_num in product(range(1, 10), range(1, 10), range(1, 10)):
temp = numerator / denominator
if temp >= 1:
continue
# 組み合わせを全て記載
if temp == (numerator * 10 + add_num) / (denominator * 10 + add_num) or \
temp == (numerator * 10 + add_num) / (denominator + add_num * 10) or \
temp == (numerator + add_num * 10) / (denominator * 10 + add_num) or \
temp == (numerator + add_num * 10) / (denominator + add_num * 10):
print(f'{numerator}/{denominator}, {add_num}')
# 積をとってから約分するので分子・分母をそれぞれかけて、
# 答えの分子・分母とする
answer_numerator *= numerator
answer_denominator *= denominator
# 分子と分母の最大公約数で分母を割り、約分したときの値を得る
print(answer_denominator // gcd(answer_denominator, answer_numerator))
if __name__ == '__main__':
main()
結果 1/4, 6 1/5, 9 2/5, 6 4/8, 9 100