Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Fibbonachi;
- {$APPTYPE CONSOLE}
- type
- TArr = array of Integer;
- TAnswer = record
- x, y: Integer;
- end;
- var
- AnswerArr: array of TAnswer;
- k: Integer;
- function CountIsAnswer(x, y: Integer; CoefY, CoefX: Integer; const N: Integer): Integer;
- var
- IsEnd: Boolean;
- begin
- repeat
- IsEnd := False;
- Result := CoefX * x + CoefY * y;
- if Result = N then // сравниваем сумму с текущими х и у и нужную нам
- begin
- IsEnd := True;
- AnswerArr[k].x := CoefX; // записываем, если подходит
- AnswerArr[k].y := CoefY;
- Inc(k);
- end;
- Inc(CoefY);
- until (N < Result) or IsEnd;
- end;
- var
- N, AverageI: Int64;
- i, j: Integer;
- IsFind: Boolean;
- FibArr: TArr;
- Temp: TAnswer;
- begin
- Readln(N);
- IsFind := False;
- SetLength(FibArr, N);
- FibArr[0] := 1;
- FibArr[1] := 1;
- i := 2;
- k := 0;
- while N > FibArr[i] do
- begin
- FibArr[i] := FibArr[i - 1] + FibArr[i - 2];
- Inc(i);
- end;
- if not IsFind then
- begin
- SetLength(AnswerArr, i);
- i := 0;
- while N > FibArr[i] do
- begin
- if N = FibArr[i] then // если равно числу Фибоначи, значит у такой есть, поэтому у = 1, а 1 минимальное
- begin
- Write('0 1');
- IsFind := True;
- end;
- if FibArr[i] < N div 2 then // тут ищется индекс примерно среднего элемента,
- AverageI := i + 2; //ибо ясно, что если не 0 1, то уже как минимум 1 1 = 50 на 50
- Inc(i);
- end;
- i := AverageI + 1;
- while i > 0 do //перебираются все возможные варики, подставляя y = 1, 2, 3 ..., а потом inc x і по новой
- begin
- j := 0;
- while (i > j) do
- begin
- IsFind := (ord(IsFind) = CountIsAnswer(FibArr[i - 1], FibArr[i], 1, j, N)); // поняла, что Оношка на экзе хотел мне сказать
- Inc(j); // CountIsAnswer понятно, что делает, но не рекурсивно(
- end;
- Dec(i);
- end;
- Temp := AnswerArr[0];
- for j := 1 to k - 1 do
- if AnswerArr[j].X + AnswerArr[j].Y < Temp.X + Temp.Y then // находим наименьшую сумму
- if AnswerArr[j].x < Temp.X then //причем с наименьшим Х
- Temp := AnswerArr[j];
- i := 0;
- Write(Temp.X,' ', Temp.Y);
- end;
- Readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement