コンピュータが3の倍数と5の倍数と3のつく数を数えるとき、あほになります。

力試しにナベアツのような判定をするプログラムを作ろうとしたところ、問題が発生しました。 3の倍数や5の倍数は考えるまでもないんですが、3のつく数字をどう判定したらいいのかわかりません。 どのように判定させればよいのでしょうか?

3の倍数と5の倍数は、3で割ったあまりと5で割ったあまりで判定するのはいいとして、問題は3のつく数字。アプローチとしては、文字列にして3を検索して発見するのが単純明快でしょう。計算でするとしたら、

  1. 一の位が3?
  2. YesならTrueで終了
  3. Noなら10でわる。あまり切り捨て。
  4. 3より小さいならFalseで終了
  5. 3以上なら1行目に戻る

でいけるでしょう。

気になることといえば、コストの問題。正規表現は確かにコストが高いが、割り算もコストは高かったような。この辺はよく分からないが、倍数は計算でやるなら3が付くも計算でやるほうがスマートな気がする。逆に、文字列でやるなら、倍数も文字列判定するとか。

で、文字列の方を考えてみると、5は文字列の最後の文字が"0"か"5"でいけるけど、3の倍数はどうすればいいんだろう。"0123456789"の文字配列を数字に変換しても、加減乗除したら計算したことになるよね。うーん、計算なしで数字をみただけで3の倍数判定はおもいつかないっす。

いろいろな解答をみていると、整数の割り算と浮動小数の割り算をまぜこぜにしているのがちょっと気になりますね。 rubyで7/5と7/5.0の答えが違うように、使い分けしないといけないのが全然スルーされている。