Определить длину периода десятичной дроби 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.
Объяснение кода листинга программы
- Объявляются переменные:
M, N, M0, P, i
- целочисленные переменные.aM
- массив целых чисел размером 1001.res, buf
- строки.
- Считываются значения M и N.
- Вычисляется частное от деления M на N и преобразуется в строку, добавляя запятую к результату.
- Вычисляется остаток от деления M на N.
- Инициализируется массив
aM
и переменные для итераций. - M умножается на 10.
- Запускается цикл, в котором происходят следующие действия:
- Вычисляется частное от деления M на N и преобразуется в строку, добавляя к результату.
- Вычисляется остаток от деления M на N и умножается на 10.
- Если M больше 0, то запускается внутренний цикл:
- Увеличивается счетчик
aM[0]
. - Заполняется массив
aM
значениями M. - Вычисляется P - количество повторений до тех пор, пока P не станет равным aM[0] или aM[P] не станет равным M.
- Увеличивается счетчик
- Проверяется условие выхода из цикла - M равен 0, либо P меньше aM[0].
- Если M равен 0, то выводится результат.
- В противном случае, к строке
res
добавляются пробел и скобка. Затем происходит сдвиг символов в строкеres
и выводится результат вместе с скобкой. - Конец программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д