Pascal
Modified: Wednesday, 22-12-2021 07:00 AM
Dữ liệu vào: Số N <10000000 (10^7)
Dữ liệu ra: Tổng của ít nhất các số fibo bằng N
Ví dụ:
N= 8 -> 8
N= 135 -> 89+34+8+3+1
var a:array[1..100] of longint;
i:byte; // So luong so Fibo
n:longint; // So nhap vao de tach
procedure sangFibo(m:longint);
var x:longint;
begin
a[1]:=1;
a[2]:=2;
i := 3;
x := a[1]+a[2];
while x<=m do
begin
a[i]:=x;
inc(i);
x := a[i-2]+a[i-1];
end;
end;
function fibo(x:longint):boolean;
var fi:longint;
begin
for fi:=1 to i do
begin
if a[fi]=x then
exit(true);
if a[fi]>x then
begin
exit(false);
end;
end;
end;
procedure tachFibo(n:longint);
var x:longint;
begin
while n<>0 do
begin
for x:=n downto 1 do
if fibo(x) then
begin
write(x,#32);
break;
end;
n := n-x;
end;
end;
begin
readln(n);
sangFibo(n);
tachFibo(n);
readln;
end.