Определить длину периода десятичной дроби M/N и период данной десятичной дроби M/N - Pascal

Узнай цену своей работы

Формулировка задачи:

Даны два натуральных числа M и N, M < N. Определить длину периода десятичной дроби M/N и период данной десятичной дроби M/N.
var
ost,ch:array[1..1000]of integer;
m,n,n1,i,j,k,konec:integer;
begin
readln(m,n);
m:=m mod n;
n1:=n;
 write('period=') ;
repeat
  if n1 mod 2=0 then n1:=n1 div 2;
  if n1 mod 5=0 then n1:=n1 div 5;
until (n1 mod 2<>0)and(n1 mod 5<>0);
if n1=1 then writeln(0)else begin
 repeat
    repeat
    m:=m*10;
    until m>=n;
     inc(i);
       ost[i]:=m mod n;
       ch[i]:=m div n;
       m:=ost[i];
        for j:=1 to i-1 do
        if m=ost[j]
           then
           begin
           for k:=j to i-1 do
           write(ch[k]);
           konec:=1;
           end;
   until konec=1;
  end;
  readln;
  end.
Как исправить чтоб выходила еще длина?

Решение задачи: «Определить длину периода десятичной дроби M/N и период данной десятичной дроби M/N»

textual
Листинг программы
var
  M, N, M0, P, i : Integer;
  aM : array [0..1000] of Integer;
  res,buf: string;
begin
  ReadLn(M, N);
  //Write(m div n,',');
  str(m div n,res);
  res+=',';
  m:=m mod n;
  aM[0] := 0;
  i:=0;
  M := M * 10;
  repeat
    //Write( M div N,' ' );
    str(m div n,buf);
    res:=res+buf;
    M := M mod N * 10;
    if M > 0 then
      begin
        Inc(aM[0]);
        aM[aM[0]] := M;
        P := 0;
        repeat
          Inc(P);
        until (P > aM[0]) or (aM[P] = M);
      end;
  until (M = 0) or (P < aM[0]);
  //WriteLn;
 
  if M = 0 then
    WriteLn(res)
  else
    begin
      //Тут начинается костыль
      res+=' ';
      for i:=length(res) downto length(res)-aM[0]+P do
         begin
            res[i]:=res[i-1];
         end;
      res[length(res)-aM[0]+P]:='(';
      WriteLn(res,')');
    end;
end.

Объяснение кода листинга программы

  1. Объявляются переменные:
    • M, N, M0, P, i - целочисленные переменные.
    • aM - массив целых чисел размером 1001.
    • res, buf - строки.
  2. Считываются значения M и N.
  3. Вычисляется частное от деления M на N и преобразуется в строку, добавляя запятую к результату.
  4. Вычисляется остаток от деления M на N.
  5. Инициализируется массив aM и переменные для итераций.
  6. M умножается на 10.
  7. Запускается цикл, в котором происходят следующие действия:
    • Вычисляется частное от деления M на N и преобразуется в строку, добавляя к результату.
    • Вычисляется остаток от деления M на N и умножается на 10.
  8. Если M больше 0, то запускается внутренний цикл:
    • Увеличивается счетчик aM[0].
    • Заполняется массив aM значениями M.
    • Вычисляется P - количество повторений до тех пор, пока P не станет равным aM[0] или aM[P] не станет равным M.
  9. Проверяется условие выхода из цикла - M равен 0, либо P меньше aM[0].
  10. Если M равен 0, то выводится результат.
  11. В противном случае, к строке res добавляются пробел и скобка. Затем происходит сдвиг символов в строке res и выводится результат вместе с скобкой.
  12. Конец программы.

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы