列表

详情


WY22. Fibonacci数列

描述

Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

输入描述

输入为一个正整数N(1 ≤ N ≤ 1,000,000)

输出描述

输出一个最小的步数变为Fibonacci数"

示例1

输入:

15

输出:

2

原站题解

Pascal 解法, 执行用时: 1ms, 内存消耗: 256KB, 提交时间: 2018-09-08

var
  f:array[1..1000000]of longint;
  a,b,i,n:longint;
begin
  f[1]:=0;
  f[2]:=1;
  i:=2;
  readln(n);
  repeat
    inc(i);
    f[i]:=f[i-1]+f[i-2];
  until f[i]>=n;
  a:=abs(f[i]-n);
  b:=abs(n-f[i-1]);
  if(a<b)then write(a)
         else write(b);
end.

Pascal 解法, 执行用时: 1ms, 内存消耗: 348KB, 提交时间: 2018-09-08

program exe;
var
    i,j,k,l,m,n:dword;
    a:array[1..50]of int64;
    xia,shang:int64;
begin
    readln(n);

    a[1]:=1; a[2]:=1;
    for i:=3 to 33 do a[i]:=a[i-1]+a[i-2];
    //for i:=1 to 33 do write(a[i],' ');
    k:=1;
    for i:=1 to 33 do
        if n>=a[k] then k:=i else break;
    xia:=a[k-1];shang:=a[k];
//    writeln(xia,shang);
    xia:=n-a[k-1];shang:=a[k]-n;
//    writeln(xia,shang);
    if xia>shang then writeln(shang) else writeln(xia);
end.

上一题