質問<2867>2006/1/17
from=kazuu
「コンピュータ」


いつのお世話になっております。以下の問題をお願いいたします。

「プログラムで小数点表示の主要計算部分は分番号250~350の間である。
この部分で1/7の場合、配列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」

長いですが、よろしくお願いいたします。

(注)タグの関係で、<>は全角を使いました。(管理人)

★希望★完全解答★

お便り2006/1/20
from=C.A.


余りに同じ値が出てきたところで打ち切る、って感じですかね。

#include <stdio.h>

#define DENOM_MAX 1000

int main(void)
{
   int a[DENOM_MAX], r[DENOM_MAX];
   int p, q;
   int i, k;

   for (i = 0; i < DENOM_MAX; i++)
      r[i] = 0;
   
   do {
      fprintf(stderr, "denominator p = ");
      scanf("%d", &p);
      if (p < DENOM_MAX)
         break;
      fprintf(stderr, "denominator must be less than or equal
         to %d.\n",
              DENOM_MAX);
   } while (1);

   fprintf(stderr, "numerator q = ");
   scanf("%d", &q);

   a[0] = q / p;
   q %= p;
   k = 0;
   do {
      k++;
      r[q] = k;
      q *= 10;
      a[k] = q / p;
      q %= p;
   } while (r[q] == 0);

   printf("%d.", a[0]);
   for (i = 1; i < r[q]; i++)
      printf("%d", a[i]);
   
   if (r[q] < k || a[k] != 0) {
      printf("{");
      for (i = r[q]; i <= k; i++)
         printf("%d", a[i]);
      printf("}\n");
   }

   return 0;
}


お便り2006/1/27
from=JJon.com


同じ質問<2608>も参照してください。