質問<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(格納済の値に戻ってきた,循環した)ので,ループ終了。