【Python】1からnまでの和を求める
1からnまでの和を求めるコード
コード例
# 1からnまでの和を求める(nは正の整数)
print('1から正の整数nまでの和を求めます。')
while True:
n = int(input('正の整数n : '))
if n > 0:
break
sum = 0
i = 1
for i in range(1, n + 1):
sum += i # sumにiを加える
i += 1 # iに1を加える
print(f'1から{n}までの和は{sum}です。')
実行結果
1から正の整数nまでの和を求めます。
正の整数n : -5
正の整数n : 0
正の整数n : 100
1から100までの和は5050です。
無限ループ
キーボードから入力された文字列を数値に変換してnに代入する文がwhile文の中に入っています。
そのwhile文の継続条件はTrueで真なのでwhile文は無限に繰り返されます。このような繰り返しを無限ループと言います。
続くif文ではnが正の整数(n > 0)であるかの判定を行っています。
その判定が成立したときに実行されるのがbreak文です。
繰り返し文の中でbreak文が実行されるとその繰り返し文の実行が強制的に終了します。
その結果無限ループから脱出しプログラムの流れは下の行へと移っていきます。
なお読み込んだnが0以下であればbreak文が実行されないためwhile文の実行が再び繰り返しnの値を入力させるよう促します。
その結果while文が終了したときのnの値は正の整数値となっています。
コード例ではnに-5や0だと再入力させて100を読み込んだ時に初めて無限ループから脱出します。
nの値を正の整数値に限定する理由
もしwhile文の箇所を「n = int(input('正の整数n : '))」だけにしたとします。このときnに-5を入力すると以下のように表示されます。
1から-5までの和は0です。
これは数学的に不正だし感覚的もおかしいと感じるはずです。
そのためnに読み込む値を正の整数である1以上に限定しています。
総和を求めるための前準備
1からnまでの総和を求める前準備として総和を格納するための変数sumの値を0にして、繰り返しを制御するための変数iの値を1に初期化しています。
1からnまでの和を求める
for文では1から入力されたnまでの総和を求めています。
まず変数sumにiを加えてその後に変数iの値を1だけインクリメントしています。
これをiの値が1からnまで繰り返すことで総和が変数sumに格納されます。
f文字列で表示
最後の文ではf文字列で1からnまでの和を表示しています。
f文字列では{}の中に式や変数を直接入れてその値を表示できるので非常に見やすいです。
formatメソッドと同じく書式指定もできるのでこれから書くのであればf文字列で書くべきです。
1からnまでの和を求める過程の式を表示するコード
次に1からnまでの和を求める過程の式を表示するように書き換えます。
コード例
# 1からnまでの和を求める(求める過程の式も表示)
print('1から正の整数nまでの和を求めます。')
while True:
n = int(input('正の整数n : '))
if n > 0:
break
sum = 0
i = 1
for i in range(1, n):
print(f'{i} + ', end='')
sum += i # sumにiを加える
print(f'{n} = ', end='')
sum += n # sumにnを加える
print(sum)
実行結果(1)
1から正の整数nまでの和を求めます。
正の整数n : 1
1 = 1
実行結果(2)
1から正の整数nまでの和を求めます。
正の整数n : 5
1 + 2 + 3 + 4 + 5 = 15
求める過程の式の表示
求める過程の式を表示させるのにあたり変更したのが総和を求めるfor文と表示するprint関数です。
for文では1からn – 1までの総和を求めています。
具体的にはiを1からn – 1までインクリメントしそれらを変数sumに代入しています。
過程の式を表示する際、総和はn – 1までは後ろに+がつくのでprint関数で「i + 」となるように表示させています。
分ける理由
総和の最後にあたるnだけfor文の繰り返しから外しています。
これはnの後は+ではなく=になるのでわざと別に分けています。
このように特定の値で異なる結果を出力させたいのであれば特別扱いするべきです。
もちろんnもsumに加えます。
そして最後に総和であるsumを表示させます。
n = 1なら+は表示されない
実行結果(1)のようにnが1の場合は1 = 1と表示されます。
この場合は+が表示されないことが実行例からもわかります。