- ベストアンサー
プログラムの意味がわからなくて困っています
- プログラムの意味がわからなくて困っています。分数q/p(p、qはともに正の整数)に関係するもので、3/13を入力したときの出力と、配列R()がどんな変化をしていくかを教えてください。
- プログラムは配列Aと配列Rを用意し、配列Rを初期化しています。分母Pが1000以下であることを確認し、分子Qを入力しています。その後、配列Aと配列Rの値を計算しているようですが、詳細まではわかりません。
- 具体的なプログラムの内容はわかりませんが、分数q/pに関係する計算を行っているようです。分母Pが1000以下であることを確認し、分子Qを入力しています。その後、配列Aと配列Rの値を計算しているようです。詳細は不明ですが、出力結果によって配列Rの変化が起こるようです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
説明の都合上居つくかのブロックに分けます。 100 option base 0 110 dim A(1000) 0) 120 dim R(999) 130 let N=1000 1) 140 for I=0 to N-1 150 let R(I)=0 160 Next I 170 do 2) 180 print"分母p="; 190 input P 200 if (P>N) then 210 print"分母は1000以下にしてください” 220 end if 230 loop while(P>N) 240 print"分子q="; 3) 250 input Q 260 let A(0)=int(Q/P) 4) 270 let Q=mod(Q,P) 280 let K=0 5) 290 Do 300 let K=K+1 310 let R(Q)=K 320 let Q=Q*10 330 let A(K)=int(Q/P) 340 let Q=mod(Q,P) 350 loop while (R(Q)=0) 360 print A(0);"."; 6) 370 for I=1 to R(Q)-1 380 print A(I); 390 next I 400 if (R(Q)<K) or (A(K)<>0) then 7) 410 print "{"; 420 for I=R(Q) to K 430 print A(I); 440 next I 450 print"}"; 460 end if 470 end プログラム全体は、2数(分子qと分母p)を受取り、 A)q/pを小数で表示する。 B)A)の値で、任意の桁で同じ余りの値が出ると、それ以降を{ }で括って表示する。 (循環少数の表示) 0)配列変数を宣言する。 1)配列Rを0で初期化する。(これが任意の桁で同じ余りの値が出たかのフラグになる) 2)分母の入力を受け取る。 N(=1000)より大きい値が入力される限りメッセージを表示し入力待ちを続ける。 3)分子の入力を受け取る。 4)配列Aの第一要素を分数値(分子/分母)を切捨てしたもので初期化する。 分子/分母の余りを変数Qに保存する。 5){(余りQを10倍したもの)/分母}の切り捨てたものを求め、配列Aの要素に順次入れていく。 同時に、{(余りQを10倍したもの)/分母}の余りを変数Qに保存する。 配列Rには、余りQ番目の要素のところに小数点何桁目かが設定される。 以上を、余りQが同じ値を取らない限り続ける。 ※ 配列Rには出現した余りQ番目の要素に、その出現した桁数を記録しているだけである。 任意の余りの値に対して配列Rの余り番目に桁数が設定されていれば、既に同じ余りの 値を検出したということで、5)の計算を中止する。 なぜならば、同じ余りの値を検出したということは、それを変わらない分母の値で再計算 する事を繰り返すので以降の結果は同じにしかならない=循環少数である。 6)配列AをA(0)を小数点"."で区切ってA(1)以降を出力する。 出力するのは、同じ余りQの値を最初に取った桁数-1まで。 7)末尾以外の桁で同じ余りの値を取るか、末尾が0でない(割り切れない)場合は、同じ余りの値 を取った桁から末尾までを{ }で括って出力する。
お礼
ありがとうございました。 とても、わかり易く説明していただいて理解できました。 計算をしたときに、その分数が循環小数になるということはわかっていたのですが,その数値をどのような形で表示させるかなど予想もできませんでした。 眼から鱗です。 本当にありがとうございました。