見出し画像

%(剰余)って何に使うの?問題にケリをつける

大上段から振りかぶったタイトルですが、そんなに深い話ではありません。プログラムの世界で剰余と言って、割り算した時の余りを返してくれる書き方があります。大体%で書きます。pythonだとこんな感じ。

amari = 10 % 3
// amariには1が入ります。

amari = 12 % 3
// amariには0が入ります。

剰余を知りたい状況って何?

剰余の説明をした後にほぼ100%聞かれるであろう「計算は分かるけど、これをいつ使うの?使い所はどこ?」っていうのにお答えしようというのがこの記事のテーマです。

最初のお題

10までの正数の中から奇数だけを取り出す時、どういう処理をしますか?奇数は2で割った余りが1なので、こんな感じかしら?と、ここまでは剰余の使い方に疑問はないと思います。

for i in range(10):
  if i % 2 == 1:  // 奇数って2で割った余りが1になるからこの条件で奇数が取れる
    print(i)

奇数や偶数を拾い出すなんて剰余に都合良すぎる例を挙げやがってって思われた方、確かにそうです。そんなこと滅多にないと思います。

少し広い視点から見る

ただ、奇数というのを少し広い視点から考えると、2回のうち1回だけ数字をピックアップしてるとも言えますね。これを元に、3の倍数だけピックアップする処理を考えてみました。

for i in range(10):
  if i % 3 == 0:  // 3の倍数って3で割り切れる、つまり3で割った余りがゼロ
    print(i)

なるほど、、、未だ振りかぶった竹刀を振り下ろせずにいますが、これからです。

次のお題

色の3原色であるRGB値の各要素を10ずつ増やしていき、色がどのように変化するか見ていきたいというお題があったとします。実際に色を表示する処理は書いていませんが、RGBの値の変化にご注目ください。

myIndex = 0
// RGBの値を格納するリスト。RGBなので3要素。
myColor = [0,0,0]

while True:
    // RGBのうち、どれかの値を255になるまで10増やしていく。
    // RGBのうちどの要素を10増やすかはmyIndexで指定。
    myColor[myIndex]=min(255,myColor[myIndex]+10)
    // 次が肝です。この計算により0,1,2をひたすら繰り返します。
    myIndex=(myIndex+1)%3
    print(myColor)
    if myColor == [255,255,255]:
        break

無限ループがいつ終わるかは条件次第(=[255,255,255]になるまで)という中で、RGBのインデックス0,1,2をひたすら繰り返したいときに%が使えるということなんです。

すごくないですか?私は初めてこういう剰余の使い方を見た時に感動したんですが、誰に説明しても「ふーん」という感じです。

まさか、if 文で0だったら1にして1だったら2にして2だったら0にしてとか書いてない?大丈夫?同じことをする処理を3パターン書いてみましたが、やっぱり最後のがスマートですよね?

// なんか残念な例
myIndex+=1
if myIndex==0:
  myIndex=1
elif myIndex==1:
  myIndex=2
else:
  myIndex=0

// ちょっといいかも
myIndex+=1
if myIndex>2:
  myIndex=0

// スマート!やっぱりこれですよね!?
myIndex=(myIndex+1)%3

もう押し付けが酷くなってきましたので、この辺にしときます。

こうなったらイメージだけ

剰余の使い所をグラフにしてみました。こんな一定数まで行ったら振り出しに戻るような時に剰余は役に立ちます。ってことだけでも伝わればいいかな。もうこのイメージだけで大上段の竹刀を振り下ろしたことにしました。

増えては元に戻るのグラフ

まとめ

もう何度も繰り返される「剰余って一体どこで使うんだ?」という疑問への答えになった…のか?次聞かれたらここ見てねと言おうと思います。

この記事が気に入ったらサポートをしてみませんか?