#問題
数学の未解決問題の一つに「コラッツの予想」があります。
コラッツの予想
自然数nについて、
・nが偶数の場合、nを2で割る
・nが奇数の場合、nに3をかけて1を足す
という操作を繰り返すとき、初期値がどんな数であっても必ず1に到達する
(1 → 4 → 2 → 1のように繰り返す)
この予想を少し変えて、初期値が偶数の場合、
初回のみnに3をかけて1を足すことから始めることとし、
「最初の数」に戻るものを考えます。
例えば、2で始めた場合は以下のようになります。
2→7→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2
同様に、4で始めると以下のようになります。
4→13→40→20→10→5→16→8→4
しかし、6で始めると、
6→19→58→29→88→44→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2→1→4→・・・
となり、6に戻ってくることはありません。
10000以下の偶数のうち、
上記の2や4のような「最初の数に戻る数」がいくつあるか、
その個数を求めてください。
引用「プログラマ脳を鍛える数学パズル 著者 増井 敏克」
#回答
l = [i for i in range(1, 10001) if i % 2 == 0]
count = 0
for j in l:
check = j * 3 + 1
while check != 1:
if check == j:
count += 1
break
elif check % 2 == 0:
check = check / 2
else:
check = check * 3 + 1
print(count) # 34
#つまづいたところ
今回はjupyter notebook
を使いながら回答しました。
いいですねjupyter notebook
。
これでないとできないものがあった訳ではありませんが、
近々使う機会ができたので使用感のために触ってみました。
さて、今回の問題では特に大きくつまづいたところはありませんでした。
短縮できそうなところがあるかもしれませんが、
ひとまずは回答と合っていましたのでここまでにしました。
はじめに前半の部分、
l = [i for i in range(1, 10001) if i % 2 == 0]
count = 0
変数lには1から10000までの偶数を配列にして代入しています。
リスト内包表記でif文を加えています。
変数countは問題文の「個数を求めてください」の個数となる部分です。
次がメインとなる後半の部分。
for j in l:
check = j * 3 + 1
while check != 1:
if check == j:
count += 1
break
elif check % 2 == 0:
check = check / 2
else:
check = check * 3 + 1
print(count) # 34
for文で変数lの要素ごとに処理が実行されるようにしています。
for文の中にさらにwhile文でコラッツの予想である、
・nが偶数の場合、nを2で割る
・nが奇数の場合、nに3をかけて1を足す
となるように処理をしています。
変数checkがjと同じの時は、
変数countに1を足してbreakによってwhlleを抜けるようにしています。
これが変数lの要素ごとに行われます。
最後のprintは回答確認ですね。
夏期休暇が終わってしまい、連続投稿が途絶えてしまいました。
1週間以内に再投稿できたのはよかったなあと自己満足しております笑
ご拝読ありがとうございました。