n進数の割り算
プログラムの仕組み
@ 変数一覧表
A$・・・・・・入力した割られる整数
A(20)・・・割られる整数
+−−0・・・正負(正=0,負=1)
+−−1・・・1の位
+−−2・・・10の位
....
AL・・・・・・A$の桁数
B$・・・・・・入力した割る整数
B(20)・・・割る整数
+−−同上
BL・・・・・・B$の桁数
H$(12)・・11進数以上のABCDEFとabcdef
+−1・・・A
+−2・・・B
+・・・・・・
+−7・・・a
・・・・
C・・・・・・・何進数か
S・・・・・・・商(10進数)
S$・・・・・・C進数の商
E$・・・・・・C進数の余り
A 割り算の考え方
1.割り算について
N進数の割り算の計算の仕方が分からなかったので、N進数の引き算を使って割り算の商と余りを求めた(小学校で、かけ算は足し算を簡略にしたもの、割り算は引き算を簡略にしたものと教えたことがあったので)。
引き算は、思ったより簡単で、普通筆算でやるように1の位から順に引いて、ただ繰り下がりの時上の位から借りてくる数が普通(10進数)では10だけど、N進数ではNになるところに気を付けてやればいいのである。
そして、割られる整数の最上位が0になったら、その桁数を1減らしていく。
これを繰り返して、引けなくなったら終了して、余りについて考えるところへ行く。
2.引けるかどうかの判定
はじめに、割られる整数の桁数と割る整数の桁数を比べて、割られる整数の桁数の方が大きければ引けるし、小さければ引けないことになる。
2つの桁数が同じ場合は、上位の位から数値を比較して、割られす整数が小さければ引けなく、大きければ引け、等しい場合は1つ下位の位を比較する。と言うように判定していく。
(例)6進数で 3215÷521
AL=4 3215 1+6−2=5
−) 521 (上位から借りてきた数)
2254 S=1
−) 521
1333 S=1+1=2
−) 521
AL=3 412 S=2+1=3
−) 521
XXX(引けない)
よって 3215÷521=3・・・412
3.余りについて
余りは正の整数にするという約束をどこかで聞いた。そこで、専門が数学の教頭先生に尋ねたら、「それでいいと思います。」と言われた。だから、
32÷ 10 = 3・・・2
−32÷ 10 =−4・・・8
32÷(−10)=−3・・・2
−32÷(−10)= 4・・・8
というようになる。つまり、割られる整数が負の数の場合は、商を1ふやして(符号はあとから考えるので)、逆に引き算をして正の数にする。例えば、2番目の場合、 32−10=22 商 1
22−10=12 商 1+1=2
12−10= 2 商 2+1=3
この2は、実は32が−32であるから、−2である。続けると、
2−10=−8 商 3+1=4
8が−8になって混乱するので、
10− 2= 8 商 3+1=4
と、逆に引き算をして求める。
B このプログラムの欠点
このプログラムでは、割り算を引き算で計算しているが、割る整数をそのまま引いて、引けたら商を+1するので、例えば1000000÷1(10進数)をすると、1000000回引き算をしなくてはいけない。かなりの時間がかかる。気の長い人はいいが、気の短い私は15秒も待てないので、割られる整数の桁数が割る整数の桁数の2倍になると待てずにSTOPキーを押してしまう。
解決方法は、割る整数をそのまま引かずに、割る整数を10倍、100倍してから引いて、10倍なら商を+10して、100倍なら商を+100すればいい。こうすると時間が短くなっていく。