Problem1
一から説明をしていくため本記事は大変長くなってしまってます。ご了承ください。
気長に読んでいただけると幸いです...
問題文
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
という問題です。
解き方の方針
すごくわかりやすい問題ですね。(手計算でもできる!)
即座に思いついた方法は
3の倍数の合計と5の倍数の合計を算出し、そこから15の倍数を引く
です!
では実際のプログラムを見てみましょう!
解答
result = 0
for i in range(1,1000):
if i%3 == 0 or i%5 == 0:
result += i
print(result)
233168
!?(゚〇゚;)マ、マジ...
for? range? 何それ? 美味しいの??
解説
どんな動きをしているの?
行数 | 内容
1 resultに0を代入する
2 iに1~999までを順に代入する
3 もし「iを3で割った余りが0」か「iを5で割った余りが0」のときに以下の文を実行する
4 resultにiを足していく
5 resultを表示する
といった感じだそうです...
方針がまったくもって違いましたね! (・ω<) てへぺろ
この解き方のほうがコードの行数が少なくてよいらしいです...
なので解説の方針はこのやり方で進めていきたいと思います!
(私の書いた方針でも出来ると思うので、後々組みたいと思います...)
演算子について
すべての演算子はここから見れます→Python入門-演算子
どうやら数式とは書き方が違うようです。
「%」
「 a % b 」は a を b で割った余りを表します!
「=」
「 a = b 」は a を b に代入する!
代入とは、入れ物 a に b というデータを保存してあげることです。
等しいとは違うので注意です!!
「==」
「 a == b 」が a と b が等しい だそうです!!
初めて見たときは衝撃でしたね...(笑)
「+=」
「 a += b 」は a に b を足して a に代入するそうです...????
⇩ この文はこう書き表すことができます。このほうが説明しやすいです。
a = a + b
b = 0 と思った方...純粋な数学者ですね!
わかりやすいイメージとしては
a の保存内容を a + b で上書き保存する
ただし、入れ物の名前は a のままですよねって感じです!
このときの入れ物を変数といいます!
残りの演算子は出てくるたびに解説します。
関数とは
値を入れて返り値が出力されるまでの処理をしてくれるものです。
分かりやすく例えると自販機のようなものです!
お金を入れる → 自販機が動く → 飲み物が出てくる
値を入れる → 関数が処理をする → 処理した値が返ってくる
関数には名前がついていて、名前を書いてあげる(宣言する)と動かせるようです。
print関数
print関数とは受け取った値を画面に出力してくれる関数です。
実際にコードで書いて実行してみましょう!
test = 1
print (test)
1
1と出力されました。
testという変数には 1 という値が与えられています。
print関数は変数の中身を表示してくれるみたいですね!
range関数とfor文
この子たちは面白いですよ!
簡単なコードで見てみましょう!
for i in range (10):
print (i)
0
1
2
3
4
5
6
7
8
9
for文ですが for と in がセットです。 in の前に変数を書いて in の後に代入したい値を書きます。
for文の詳しい解説はまた後日書こうと思っているため、今のところfor文は繰り返すことができると解釈しておいてください。
range関数は連続した数字を生成できる関数です。
正しい書き方としては range ( 開始値 , 終了値 , 増加値 ) と書きます。開始値がない場合は0から開始します。増加値がない場合は1づつ増加します。
終了値に関しては、終了値自身は生成されないので注意が必要です。
つまり、上記のコードは生成した0~9までの値を一つずつ出力してくれているんですね!
if文
if文はその名の通り「もし~ならば以下の文を実行する」という命令文が書けます。
次のコードは 0~9 までの整数を偶奇判定したものです。
for a in range (10):
if a % 2 == 0:
print ("Even")
else:
print ("Odd")
Even
Odd
Even
Odd
Even
Odd
Even
Odd
Even
Odd
else というものがありますが、これは if のときの条件式に合わなかったときにのみ実行されます。
ここまでがなんとなく理解できていれば...
ここまでがなんとなく理解できていれば、今回の問題の解答もなんとなく理解できると思います。
もう一度問題のコ解答を見ながら理解を深めていきましょう!
result = 0
for i in range(1,1000):
if i%3 == 0 or i%5 == 0:
result += i
print(result)
まず、一行目の result = 0 で result という変数に 0 を代入して、宣言してあげています。
二行目からは繰り返しのための for文 が使われていて、変数 i に 1 ~ 999 までの値を繰り返し代入するように命令しています。
三行目では条件分岐のための if文 が使われています。
ここでの条件は、 「 i を 3 で割った余りが 0 」か「 i を 5 で割った余りが 0 」です。
四行目は上の条件を満たす i を result に足して、その合計値を result に代入しています。
そして最後、五行目で最終的な result の合計値を出力しています。
最後に
今回の問題では、
- 演算子の使い方
- 変数の宣言と代入
- print関数
- range関数
- for文
- if文
について記述しました。
これらはプログラミングにおいてとても重要な者たちですので必ず覚えておいてください!
初めてプログラムに触れる人にとっては少しわかりにくい内容だったかと思います。
なのでこれからも project euler は解いていきますが、それとは別に python のさらに詳しい解説をする記事を書いていく予定ですので、あきらめないでください!!
具体的には、それぞれの文や関数を一つ一つ掘り下げて解説したり、そもそも文や関数を使ってどのようにコードを書いていくのかなどです。
解説足らずな点も多々あるため、疑問に思ったらぜひ質問をしてください。(特に初心者の方は)