программа паскаль. пользователь вводит целое число, надо его вывести как несколько простых (пример 112=2*2*2*2*7)
Ответы
Ответ дал:
0
Поиск простых делителей числа:
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
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
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.
и это попроще да
Думаю можно написать ещё короче, но я не очень владею именно паскалем, не знаю как оптимизировать код. На си, однако, покрасивее вышло бы.
что значит foo?
Просто имя функции. Функция должна иметь какое-нибудь имя, так же как и переменная должна иметь имя.
Здесь имеется функция, имя которой дано (произвольным образом) foo. Вообще, в алгоритме функция нужна чтобы перезапускаться заново после того, как выявила делитель числа. Нашла у числа делитель, разделила на него, и получила новое число, с котором та же процедура повторяется, и так пока число не сведётся к простому.
зачем do b+1?
Переменная d содержит проверяемый делитель. В начале программы (первый запуск foo ( n , 2) проверяемый делитель устанавливается в 2, и проверяется делимость числа на 2. Если делится, то число делится на 2 столько раз, сколько возможно, и в результате останется обрезанное число - частное от деления исходного на сколько имеется двоек.
Затем нужно пытаться проверить число на следующий делитель, для этого d увеличивается на 1. Таким образом, далее идёт проверка на делимость на 3, и так далее, пока в итоге от исходного числа не останется простое.
Затем на 4, но эта проверка в реале не сработает ни разу, потому что отсеялись двойки. Далее d увеличится до 5, и пойдёт проверка на делимость на 5, и так далее.
Вас заинтересует
1 год назад
1 год назад
2 года назад
7 лет назад
9 лет назад