プロが教えるわが家の防犯対策術!

※数値はすべて整数だと思ってください。
※「A % B」は「A」を「B」で割った剰余です(A mod B)

表題の件ですが、例えば、「A」が入力された文字数、「B」が基準となる文字数とします。
すると「C = A + (B - A % B)」で「C」に代入される数値はかならず「B」の倍数になることが保証されています。

具体的には:
A=15、B=16の場合 => C = 15 + (16 - 15 % 16) なので C は 16
A=17、B=16の場合 => C = 17 + (16 - 17 % 16) なので C は 32
A=3、B=10の場合 => C = 3 + (10 - 3 % 10) なので C は 10
A=10、B=3の場合 => C = 10 + (3 - 10 % 3) なので C は 12

となり、入力された文字数が基準となる文字数に満たない場合は基準まで文字数を補填し、入力が基準以上の場合は基準の倍数まで文字数を補填することになります。

そうなることは分かるのですが、「なぜそうなるのか?」のイメージがつかめずモヤモヤしています。

「A」が「B」より小さいときは、まだ分かるのですが(基準に足りない分を足しているだけなので)、「A」が「B」より大きい場合に、「C」が必ず「B」の倍数になることをどう証明したら良いでしょうか。

皆さんのお知恵を拝借できれば幸いです。

よろしくお願いします。

A 回答 (2件)

並べ替えれば,


C = A - (A % B) + B

A - (A % B) は,Aから余りを引いているのでBの倍数.
それにBを足しても当然Bの倍数
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

「A - (A % B) は,Aから余りを引いているのでBの倍数」のイメージがつかめずに
モヤモヤしていたのですが、No.2の回答のように「A=nB+r」、「A%B=r」として
「C=(nB+r)+(B-r)」と書いてみると、どういう計算をしているのかわかります。

なんとなく、「A%B」を別の書き方をすればいいんだろうなー、くらいに思っていたわけですが、
実は、「A」を「Bのn倍に余りを足したもの(nB+r)」と考えれば良かったんですね。

自分の頭の悪さにゲンナリです…

お礼日時:2017/02/21 10:31

https://oshiete.goo.ne.jp/qa/9644167.html
と全く同じ質問なわけだが, A を B で割った商と余りをそれぞれ n, r と置いたときに A と A%B を B, n, r で書いてみればわかる.
    • good
    • 0
この回答へのお礼

なるほど!やっと理解できました。

「A=nB+r」、「A%B=r」として…
「C=(nB+r)+(B-r)」と書いてみると構造が見えてきますね。

実はコレ、下記の関数のアルゴリズムです(Pythonです)。
「s」に文字列、「size」に出力のサイズを渡して実行すると、
「s」が「size」の倍数サイズのバイト列になるというものです。

def mkpad(s, size):
s = s.encode("utf-8") # UTF-8文字列をバイト列に変換する
pad = b' ' * (size - len(s) % size)
return s + pad

ちょー基本的なアルゴリズだと思いますが、人に助けてもらわないと仕組みが理解できないくらいなので、
何もないところから、自分でこのアルゴリズムを思いつくのは無理でしょうね…。

これからもコツコツ修行したいと思います。

お礼日時:2017/02/21 10:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!