Advertisement
Guest User

Grustny Kotik

a guest
Mar 16th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.69 KB | None | 0 0
  1. program Fibbonachi;
  2.  
  3. {$APPTYPE CONSOLE}
  4. type
  5.    TArr = array of Integer;
  6.    TAnswer = record
  7.       x, y: Integer;
  8.    end;
  9. var
  10.    AnswerArr: array of TAnswer;
  11.    k: Integer;
  12.  
  13. function CountIsAnswer(x, y: Integer; CoefY, CoefX: Integer; const N: Integer): Integer;
  14. var
  15.    IsEnd: Boolean;
  16. begin
  17.    repeat
  18.       IsEnd := False;
  19.       Result := CoefX * x + CoefY * y;
  20.       if Result = N then // сравниваем сумму с текущими х и у  и нужную нам
  21.       begin
  22.          IsEnd := True;
  23.          AnswerArr[k].x := CoefX; // записываем, если подходит
  24.          AnswerArr[k].y := CoefY;
  25.          Inc(k);
  26.       end;
  27.       Inc(CoefY);
  28.    until (N < Result) or IsEnd;
  29. end;
  30.  
  31.  
  32.  
  33. var
  34.    N, AverageI: Int64;
  35.    i, j: Integer;
  36.    IsFind: Boolean;
  37.    FibArr: TArr;
  38.    Temp: TAnswer;
  39. begin
  40.    Readln(N);
  41.    IsFind := False;
  42.    SetLength(FibArr, N);
  43.    FibArr[0] := 1;
  44.    FibArr[1] := 1;
  45.    i := 2;
  46.    k := 0;
  47.    while N > FibArr[i] do
  48.    begin
  49.       FibArr[i] := FibArr[i - 1] + FibArr[i - 2];
  50.       Inc(i);
  51.    end;
  52.    if not IsFind then
  53.    begin
  54.       SetLength(AnswerArr, i);
  55.       i := 0;
  56.       while N > FibArr[i] do
  57.       begin
  58.          if N = FibArr[i] then // если равно числу Фибоначи, значит у такой есть, поэтому у = 1, а 1 минимальное
  59.          begin
  60.             Write('0 1');
  61.             IsFind := True;
  62.          end;
  63.          if FibArr[i] < N div 2 then   // тут ищется индекс примерно среднего элемента,
  64.             AverageI := i + 2;         //ибо ясно, что если не 0 1, то уже как минимум 1 1 =  50 на 50
  65.          Inc(i);
  66.       end;
  67.       i := AverageI + 1;
  68.       while i > 0 do   //перебираются все возможные варики, подставляя y = 1, 2, 3 ..., а потом inc x і по новой
  69.       begin
  70.          j := 0;
  71.          while  (i > j) do
  72.          begin
  73.             IsFind := (ord(IsFind) = CountIsAnswer(FibArr[i - 1], FibArr[i], 1, j, N)); // поняла, что Оношка на экзе хотел мне сказать
  74.             Inc(j); // CountIsAnswer понятно, что делает, но не рекурсивно(
  75.          end;
  76.          Dec(i);
  77.       end;
  78.       Temp := AnswerArr[0];
  79.       for j := 1 to k - 1 do
  80.          if AnswerArr[j].X + AnswerArr[j].Y < Temp.X + Temp.Y then  // находим наименьшую сумму
  81.             if AnswerArr[j].x < Temp.X then   //причем с наименьшим Х
  82.                Temp := AnswerArr[j];
  83.       i := 0;
  84.       Write(Temp.X,' ', Temp.Y);
  85.       end;
  86.    Readln;
  87. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement