質問<2608>2005/10/4
高校の内容ではないかもしれませんが、全く分からないので教えて下さい。
循環小数のプログラムなのですが、どうしてこのプログラムで、
1/7=0.{142857}というように循環部分が求められるのか教えて下さい。(行番号は省略しました)
OPTION BASE 0
DIM A(1000)
DIM R(999)
LET N=1000
FOR I=0 TO N-1
LET R(I)=0
NEXT I
DO
PRINT "分母p=";
INPUT P
IF (P>N) THEN
PRINT "分母は1000以下にしてください。"
END IF
LOOP WHILE (P>N)
PRINT "分子q=";
INPUT Q
LET A(0)=INT(Q/P)
LET Q=MOD(Q,P)
LET K=0
DO
LET K=K+1
LET R(Q)=K
LET A(K)=INT(Q/P)
LET Q=MOD(Q,P)
LOOP WHILE (R(Q)=0)
PRINT A(0);"/・";
FOR I=1 TO R(Q)-1
PRINT A(I);
NEXT I
IF (R(Q)<K) OR (A(K)<>0) THEN
PRINT "{";
FOR I=R(Q) TO K
PRINT A(I);
NEXT I
PRINT "}";
END IF
END
(※不等号はタグの関係で大文字にしてあります。管理人談)
★希望★完全解答★
お便り2005/10/28
from=JJon.com
主ループの中でQを10倍する処理がないので,正しく実行できません。
DO
LET K=K+1
LET R(Q)=K
LET Q=Q*10
LET A(K)=INT(Q/P)
LET Q=MOD(Q,P)
LOOP WHILE (R(Q)=0)
となるはずです。
主ループ中の値の変化をトレースすると次のようになります。
小数部をどのように求めているのか,流れを追ってみてください。
1/7=0.1428571 の整数部「0」を A(0) に格納, 1/7の余り「1」をQに格納。
R(Q)=K なので R(1)←1つ目。 Qを10倍する。
10/7=1.4285714 の整数部「4」を A(1) に格納,10/7の余り「3」をQに格納。
R(Q)=K なので R(3)←2つ目。 Qを10倍する。
30/7=4.2857142 の整数部「4」を A(2) に格納,30/7の余り「2」をQに格納。
R(Q)=K なので R(2)←3つ目。 Qを10倍する。
20/7=2.8571428 の整数部「2」を A(3) に格納,20/7の余り「6」をQに格納。
R(Q)=K なので R(6)←4つ目。 Qを10倍する。
60/7=8.5714285 の整数部「8」を A(4) に格納,60/7の余り「4」をQに格納。
R(Q)=K なので R(4)←5つ目。 Qを10倍する。
40/7=5.7142857 の整数部「5」を A(5) に格納,40/7の余り「5」をQに格納。
R(Q)=K なので R(5)←6つ目。 Qを10倍する。
50/7=7.1428571 の整数部「7」を A(6) に格納,50/7の余り「1」をQに格納。
R(1)≠0(格納済の値に戻ってきた,循環した)ので,ループ終了。