見出し画像

割り算(割り切れるかどうかの判定)

何人かで食事にいって割り勘するとき、なるべくケータイを使わないでさっと一人いくら、と暗算できるとクールかもしれない(笑)。まあいまどきそんな人はいないのだが、2から5までの数で割れるかどうかの計算は意外と簡単にできる。まず、2だが、偶数ならば割れる。合計4000円なら一人2000円だし、2940円だとしても1470円となる。
3で割れるかどうかは、各桁を足して3で割れるかどうか、で判定できる。これは、例えば、3桁の数をax100+bx10+c = 99a+9b+(a+b+c)=3(33a+3b)+(a+b+c)となり(a+b+c)が3xM(整数)の形にかければ、全体も3で割れることからわかる。prologで書くと以下のようになる。

% 「おもしろいほど数学センスが身につく本」橋本道雄著,講談社
% pp.81, 倍数の判定法より
sum_digit(N,Sum) :-
   number_codes(N,L),
   sum_digit_aux(L,0,Sum),
   !.
sum_digit_aux([],Sum,Sum) :- !.
sum_digit_aux([X|Rest],S,Sum) :-
   name(N,[X]),
   S1 is S + N,
   sum_digit_aux(Rest,S1,Sum).
% -----------------------------------------
can_divide(3,Integer) :-
   sum_digit(Integer,Sum),
   0 is mod(Sum,3),
   write(Integer),write('は3の倍数です: 各桁の総和が3の倍数'),nl,!.
can_divide(3,I) :- write(I),write('は3の倍数ではありません'),nl,!.

この方法を知っていると、ある数が素数かどうかの判定もすぐにできるときがある。1619, 1621は素数だが、1623は素数ではない。1+6+2+3 = 12 となり、3で割れる。実際に、1623 = 3 x 541 で3で割れる。
4で割り切れるかどうかは下2桁が4の倍数かどうかでわかる。例えば、512の下2桁は12でこれは4で割れる。実際に、512 = 4x128 となり4で割れる。3桁以上は100 x n=4 x 25 x n のようになっているので必ず4で割れる。よって、下桁が4で割れれば全体も4で割れることになる。

can_divide(4,I) :-
   number_codes(I,L),
   length(L,1),
   0 is mod(I,4),
   write(I),write('は4の倍数です: 下2桁が4の倍数'),nl,!.
can_divide(4,I) :-
   number_codes(I,L),
   length(L,1),
   write(I),write('は4の倍数ではありません'),nl,!.
can_divide(4,I) :-
   number_codes(I,L),
   length(L,N),
   N > 1,
   get_last2(L,L2),
   number_codes(Lower2,L2),
   0 is mod(Lower2,4),
   write(I),write('は4の倍数です: 下2桁が4の倍数'),nl,!.
can_divide(4,I) :-
   write(I),write('は4の倍数ではありません'),nl,!.

5で割れるかどうかは下1桁が0か5でわかる(上の議論と同様に10桁以上の数字は10a+100b+1000c... のように書け、10, 100, 1000, 10000は5の倍数だから下1桁目だけみればよい)。例えば、225ならば225 = 5x45 のように5で割れる。400も400=5x80 のように割れる。

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