Определить длину периода десятичной дроби 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и выводится результат вместе с скобкой. - Конец программы.