LoginSignup
2
2

More than 3 years have passed since last update.

Project Euler 033を解いてみる。「桁消去分数」

Last updated at Posted at 2019-09-30

Project Euler 033

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2