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

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

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

Даны два натуральных числа M и N, M < N. Определить длину периода десятичной дроби M/N и период данной десятичной дроби M/N.
Листинг программы
  1. var
  2. ost,ch:array[1..1000]of integer;
  3. m,n,n1,i,j,k,konec:integer;
  4. begin
  5. readln(m,n);
  6. m:=m mod n;
  7. n1:=n;
  8. write('period=') ;
  9. repeat
  10. if n1 mod 2=0 then n1:=n1 div 2;
  11. if n1 mod 5=0 then n1:=n1 div 5;
  12. until (n1 mod 2<>0)and(n1 mod 5<>0);
  13. if n1=1 then writeln(0)else begin
  14. repeat
  15. repeat
  16. m:=m*10;
  17. until m>=n;
  18. inc(i);
  19. ost[i]:=m mod n;
  20. ch[i]:=m div n;
  21. m:=ost[i];
  22. for j:=1 to i-1 do
  23. if m=ost[j]
  24. then
  25. begin
  26. for k:=j to i-1 do
  27. write(ch[k]);
  28. konec:=1;
  29. end;
  30. until konec=1;
  31. end;
  32. readln;
  33. end.
Как исправить чтоб выходила еще длина?

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

textual
Листинг программы
  1. var
  2.   M, N, M0, P, i : Integer;
  3.   aM : array [0..1000] of Integer;
  4.   res,buf: string;
  5. begin
  6.   ReadLn(M, N);
  7.   //Write(m div n,',');
  8.   str(m div n,res);
  9.   res+=',';
  10.   m:=m mod n;
  11.   aM[0] := 0;
  12.   i:=0;
  13.   M := M * 10;
  14.   repeat
  15.     //Write( M div N,' ' );
  16.     str(m div n,buf);
  17.     res:=res+buf;
  18.     M := M mod N * 10;
  19.     if M > 0 then
  20.       begin
  21.         Inc(aM[0]);
  22.         aM[aM[0]] := M;
  23.         P := 0;
  24.         repeat
  25.           Inc(P);
  26.         until (P > aM[0]) or (aM[P] = M);
  27.       end;
  28.   until (M = 0) or (P < aM[0]);
  29.   //WriteLn;
  30.  
  31.   if M = 0 then
  32.     WriteLn(res)
  33.   else
  34.     begin
  35.       //Тут начинается костыль
  36.       res+=' ';
  37.       for i:=length(res) downto length(res)-aM[0]+P do
  38.          begin
  39.             res[i]:=res[i-1];
  40.          end;
  41.       res[length(res)-aM[0]+P]:='(';
  42.       WriteLn(res,')');
  43.     end;
  44. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы