質問<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
回答者 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)

となるはずです。
主ループ中の値の変化をトレースすると次のようになります。
小数部をどのように求めているのか,流れを追ってみてください。

\(\frac{1}{7}\)=0.1428571 の整数部「0」を A(0) に格納, \(\frac{1}{7}\)の余り「1」をQに格納。
R(Q)=K なので R(1)←1つ目。 Qを10倍する。
\(\frac{10}{7}\)=1.4285714 の整数部「4」を A(1) に格納,\(\frac{10}{7}\)の余り「3」をQに格納。
R(Q)=K なので R(3)←2つ目。 Qを10倍する。
\(\frac{30}{7}\)=4.2857142 の整数部「4」を A(2) に格納,\(\frac{30}{7}\)の余り「2」をQに格納。
R(Q)=K なので R(2)←3つ目。 Qを10倍する。
\(\frac{20}{7}\)=2.8571428 の整数部「2」を A(3) に格納,\(\frac{20}{7}\)の余り「6」をQに格納。
R(Q)=K なので R(6)←4つ目。 Qを10倍する。
\(\frac{60}{7}\)=8.5714285 の整数部「8」を A(4) に格納,\(\frac{60}{7}\)の余り「4」をQに格納。
R(Q)=K なので R(4)←5つ目。 Qを10倍する。
\(\frac{40}{7}\)=5.7142857 の整数部「5」を A(5) に格納,\(\frac{40}{7}\)の余り「5」をQに格納。
R(Q)=K なので R(5)←6つ目。 Qを10倍する。
\(\frac{50}{7}\)=7.1428571 の整数部「7」を A(6) に格納,\(\frac{50}{7}\)の余り「1」をQに格納。
R(1)≠0(格納済の値に戻ってきた,循環した)ので,ループ終了。