質問<2608>2005/10/4
from=バンビ
「プログラミング」


 高校の内容ではないかもしれませんが、全く分からないので教えて下さい。
 循環小数のプログラムなのですが、どうしてこのプログラムで、
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(格納済の値に戻ってきた,循環した)ので,ループ終了。