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

※数値はすべて整数だと思ってください。

表題の件ですが、例えば、「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 回答 (3件)

失礼しました。


先の回答で、r は不要でした。混乱させてしましました。

一言で言えば、
「ある数を別の数で割って、あまりが出たら、ある数から予めあまりの分を引いたものは、割り切れる」です。(あまり0になるので)

さて、一般に、AをBで割ったときに、商が n あまりが r という関係は、
A = nB + r と書けます。
右辺のうち、nB は B で割ると(割り切れて)n ですし、その後、r が余ります。

質問の式では、あまりが A % B という式で表されていますから、あまりをこれで置き換えると

A = nB + (A % B) になります。
質問の式の右辺
A + (B - A % B)
の順序を入れ替えると

A - (A % B) + B です。
A - A % B は、上述の通り、Bで割り切れて、(商を n とすると)
A - A % B = nB と表現できます。

あとは、+B ですが、一般に、
「ある数で割り切れるふたつの数を足したり引いたりした結果も、その数で割り切れる」と言えます。
だから、A - A % B (ここまで、Bで割り切れる) + B(これも、Bで割り切れる)の結果は、Bで割り切れます。

式で表現すると、

A - A%B + B = nB + B = (n + 1)B なので、Aは、商 n + 1 (ここで、n は、A をBで割った商)で割り切れます。
    • good
    • 0
この回答へのお礼

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

やっと腑に落ちました。
「A = nB + r 」とするのがポイントですね。

「A=nB+r」、「A%B=r」として、元の式を
「C=(nB+r)+(B-r)」と書き換えると構造が一目瞭然ですね。

これなら、必ず「C」が「B」の倍数になることが保証できるようになるわけだ…。

実はコレ、元は下記の関数のアルゴリズムです(Pythonです)。

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

「s」に文字列、「size」に任意のサイズを渡して実行すると、
「size」の倍数のバイト列は返ってくるというものですが、
今後は、この程度のアルゴリズムは自前に考えられるようになりたいものです。

現時点では、目の前に提示された式から常に意図した値が得られることを証明することもできないわけですが、
定石を反復練習するうちに自分の手が打てるようになることを信じて、
コツコツ精進していきたいと思います。

ご指導ありがとうございました。

お礼日時:2017/02/21 14:06

>基準に足りない分を足しているだけなので


「A」が「B」より大きい場合もおなじですよ
「A」が「B」の倍数に足りない分 (B - A % B)を足しているだけです。

A=10、B=3の場合 => 2=(3 - 10 % 3)不足ですよね。
    • good
    • 0

A%Bを考えましょう。


これはAをBで割った余りですね。
だから、あるn,rが存在して、
A=nB+(A%B)と書けます
だから A-(A%B)=(nB+A%B)-(A%B)=nB です。
つまりC=nB+B=(n+1)B はBの倍数です。
    • good
    • 0
この回答へのお礼

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

「あるn,rが存在して」ということは、等比数列的な考え方で理解できるということでしょうか?
(「r」は公比?)

申し訳ありませんが、「A=nB+(A%B)と書けます」でいきなりついて行けませんでした(汗)
元の式「A+(B-A%B)」を素朴に変形すれば「A=-B+(A%B)」ですよね……

ご説明中の「r」はどこに行ってしまったんでしょうか?

「a mod b」で「a」をインクリメントすると、「b」周期の繰り返しになるので、もしかして時計算的な考え方をすんだろうか?
…とか、まだモヤモヤしてます。

お礼日時:2017/02/21 08:57

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