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.