// PascalABC.NET 3.0, сборка 1128 var i,j,k,n,p:longint; f:array[1..10,1..2] of longint; begin p:=2; i:=1; f[1,1]:=1; f[1,2]:=1; Write('Введите натуральное число не больше 2 147 483 647: '); Read(n); while n<>1 do begin if (n mod p)=0 then begin if f[i,1]<>p then begin Inc(i); f[i,1]:=p; f[i,2]:=1 end else Inc(f[i,2]); n:=n div p end else inc(p) end; k:=i; for i:=2 to k do for j:=1 to f[i,2] do Write(f[i,1],' '); Writeln end.
Тестовое решение: Введите натуральное число не больше 2 147 483 647: 37534 2 7 7 383
1) Решение методом рекурсии. Программа проста в понимании, но неэффективна при больших значениях var n: integer; function f(i: integer): longint; begin if i < 2 then f := 1 else f := f(i - 1) + f(i - 2); end; begin read(n); writeln(f(n)); end.
2) Решение методом динамического программирования. Намного быстрее метода с рекурсией. var i, n: integer; f: array[0..50] of longint; begin read(n); f[0] := 1; f[1] := 1; for i := 2 to n do f[i] := f[i - 1] + f[i - 2]; writeln(f[n]); end.
3) Решение методом моделирования. Использует меньше памяти. var n, a, b, i: integer; begin read(n); if n < 2 then a := 1 else begin a := 0; b := 1; for i := 0 to n do begin b := a + b; a := b - a; end; end; writeln(a); end.
var
i,j,k,n,p:longint;
f:array[1..10,1..2] of longint;
begin
p:=2; i:=1;
f[1,1]:=1; f[1,2]:=1;
Write('Введите натуральное число не больше 2 147 483 647: ');
Read(n);
while n<>1 do begin
if (n mod p)=0 then begin
if f[i,1]<>p then
begin Inc(i); f[i,1]:=p; f[i,2]:=1 end
else Inc(f[i,2]);
n:=n div p
end
else inc(p)
end;
k:=i;
for i:=2 to k do
for j:=1 to f[i,2] do Write(f[i,1],' ');
Writeln
end.
Тестовое решение:
Введите натуральное число не больше 2 147 483 647: 37534
2 7 7 383
Программа проста в понимании, но неэффективна при больших значениях
var
n: integer;
function f(i: integer): longint;
begin
if i < 2 then
f := 1
else
f := f(i - 1) + f(i - 2);
end;
begin
read(n);
writeln(f(n));
end.
2) Решение методом динамического программирования. Намного быстрее метода с рекурсией.
var
i, n: integer;
f: array[0..50] of longint;
begin
read(n);
f[0] := 1;
f[1] := 1;
for i := 2 to n do
f[i] := f[i - 1] + f[i - 2];
writeln(f[n]);
end.
3) Решение методом моделирования. Использует меньше памяти.
var
n, a, b, i: integer;
begin
read(n);
if n < 2 then
a := 1
else
begin
a := 0;
b := 1;
for i := 0 to n do
begin
b := a + b;
a := b - a;
end;
end;
writeln(a);
end.