1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Python】 プロジェクトオイラー Problem 2

Last updated at Posted at 2019-07-02

フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.

#####1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
####数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

Problem1は**こちら**から

2問目にして知らない単語が...フィボナッチ数列とは...

[https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0:title]

ここに書いてること曰く

上の「1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...」で考えるとすると、

1+2で3、2+3で5、3+5で8、5+8で13、8+13で21...

みたいに1つ目の項と2つ目の項を足して、出てきた値を2つ目の項と足して、出てきた値をさっき出てきた値と足して...

文字にすると途端にややこしくなったけど何とかなりそう。

とりえずフィボナッチの条件は

######1.aとbという変数を用意してそれぞれに1と2を代入して

######2.足した値をcという変数に代入して

######3.a = b と b = c としてそれを繰り返す

これでフィボナッチ数列ができているはず。

今のところは終わる条件を指定しないでwhile関数を使ってみる

a = 1
b = 2
while :
        c = a + b
        a = b
        b = c

とかでいいのかと思ったら、

条件なしで無限ループさせるときはwhile True: という物を使うらしいので

a = 1
b = 2
while True:
        c = a + b
        a = b
        b = c

でいいと思う。

確認してみる

a = 1
b = 2
c = 0
while c < 30:
        c = a + b
        print(c)
        a = b
        b = c

3,5,8,13,21,34

これでcが30よりも小さいときのみループする文になったのだが...

34が出てきている理由はprint(c)の位置がおかしいからかな

ともかく、フィボナッチ数列をプログラム化できた。

ここにきてやっとProblem2の問題の答えを出す手順を考える

######1.whileの条件式を c が400万以下のときのみループするようにして
######2. c が偶数のときのみ答えとする変数に合算する

これでできるはず。

偶数の時のみ合算するのはProblem1のときみたいにif関数で条件を作ればいいかな

というわけで部分ずつ作っていく

a = 1
b = 2
c = 0
while c < 4000000:
        c = a + b
        a = b
        b = c

これで400万以下に指定して

        if c % 2 == 0:
                kotae += c

これで c が偶数の時のみkotaeという変数に足していきます。

実行してみる

a = 1
b = 2
c = 0
kotae = 0
while c < 4000000:
        c = a + b
        a = b
        b = c
        if c % 2 == 0:
                kotae += c
print(kotae)

4613730

当たっているのだろうか

[http://kingyojima.net/pje/002.html:title]

正解は4613732だから間違えているっぽいけど...

2足りないだけだからほぼあっているはず

いろいろ調べてみた結果

######フィボナッチ数列は1+1から始まる

らしい...

ビックリするくらい根本的な問題だったので、b=1にして再計算する

a = 1
b = 1
c = 0
kotae = 0
while c < 4000000:
        c = a + b
        a = b
        b = c
        if c % 2 == 0:
                kotae += c
print(kotae)

4613732

あってたーー

Problem4は**こちら**から

Problem3はまだ解けていません!! ごめんなさい!

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?