var i,j,n:longint; f:boolean; begin writeln('Введите число'); readln(n); if n<2 then writeln('Простых делителей нет') else begin write('Число ',n,' ','= 1'); for i:=2 to n do if n mod i=0 then begin f:=true; j:=2; while f and(j<=round(sqrt(i/2)))do begin if i mod j=0 then f:=false else j:=j+1; end; if f then write('*',i); end; end; end.
Тестовое решение:
Введите число 2345 Число 2345 = 1*5*7*35*67
1 votes Thanks 0
NeznaikaNaLune2017
var n : integer ; function foo ( i , d : integer ) : integer ; begin if ( d = i ) then writeln ( d ) else if ( ( i mod d ) = 0 ) then begin write ( d , '*' ) ; foo ( i div d , d ) ; end else begin while ( ( d <= i ) AND ( ( i mod d ) <> 0 ) ) do d := d + 1 ; foo ( i , d ) ; end ; end; begin write ('vvedite chislo n=' ) ; read ( n ) ; write ( n , '=' ) ; if ( n > 3 ) then foo ( n , 2 ) else writeln ( n ) ; end.
NeznaikaNaLune2017
Думаю можно написать ещё короче, но я не очень владею именно паскалем, не знаю как оптимизировать код. На си, однако, покрасивее вышло бы.
NeznaikaNaLune2017
Просто имя функции. Функция должна иметь какое-нибудь имя, так же как и переменная должна иметь имя.
NeznaikaNaLune2017
Здесь имеется функция, имя которой дано (произвольным образом) foo. Вообще, в алгоритме функция нужна чтобы перезапускаться заново после того, как выявила делитель числа. Нашла у числа делитель, разделила на него, и получила новое число, с котором та же процедура повторяется, и так пока число не сведётся к простому.
NeznaikaNaLune2017
Переменная d содержит проверяемый делитель. В начале программы (первый запуск foo ( n , 2) проверяемый делитель устанавливается в 2, и проверяется делимость числа на 2. Если делится, то число делится на 2 столько раз, сколько возможно, и в результате останется обрезанное число - частное от деления исходного на сколько имеется двоек.
NeznaikaNaLune2017
Затем нужно пытаться проверить число на следующий делитель, для этого d увеличивается на 1. Таким образом, далее идёт проверка на делимость на 3, и так далее, пока в итоге от исходного числа не останется простое.
NeznaikaNaLune2017
Затем на 4, но эта проверка в реале не сработает ни разу, потому что отсеялись двойки. Далее d увеличится до 5, и пойдёт проверка на делимость на 5, и так далее.
Answers & Comments
var i,j,n:longint;
f:boolean;
begin
writeln('Введите число');
readln(n);
if n<2 then writeln('Простых делителей нет')
else
begin
write('Число ',n,' ','= 1');
for i:=2 to n do
if n mod i=0 then
begin
f:=true;
j:=2;
while f and(j<=round(sqrt(i/2)))do
begin
if i mod j=0 then f:=false
else j:=j+1;
end;
if f then write('*',i);
end;
end;
end.
Тестовое решение:
Введите число
2345
Число 2345 = 1*5*7*35*67