こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラムの意味がわからなくて困っています

こんにちは。以下のプログラムの意味がわからなくて困っています。分数q/p(p、qはともに正の整数)に関係するもので、3/13を入力したときの出力と、配列R()がどんな変化をしていくかを教えてください。
100 option base 0
110 dim A(1000)
120 dim R(999)
130 let N=1000
140 for I=0 to N-1
150 let R(I)=0
160 Next I
170 do
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=";
250 input Q
260 let A(0)=int(Q/P)
270 let Q=mod(Q,P)
280 let K=0
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);".";
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
410 print "{";
420 for I=R(Q) to K
430 print A(I);
440 next I
450 print"}";
460 end if
470 end

100から160までで配列Aを1000個、配列Rを999個準備し、配列Rの中身を0にしている。
170から230で分母Pに13を入れ分母が1000以下になることを確認している。1000以上であれば、1000以下になるまでループ内を繰り返す。
240以下で分子を入れているようですが、ここからよくわからなくなってしまいました。 よろしくお願いします。
 

投稿日時 - 2006-10-18 21:43:15

QNo.2481571

すぐに回答ほしいです

質問者が選んだベストアンサー

説明の都合上居つくかのブロックに分けます。

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でない(割り切れない)場合は、同じ余りの値
  を取った桁から末尾までを{ }で括って出力する。

投稿日時 - 2006-10-19 02:42:54

お礼

ありがとうございました。
とても、わかり易く説明していただいて理解できました。
計算をしたときに、その分数が循環小数になるということはわかっていたのですが,その数値をどのような形で表示させるかなど予想もできませんでした。
眼から鱗です。
本当にありがとうございました。

投稿日時 - 2006-10-19 19:35:59

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問