【牛客】[编程题]Fibonacci数列(给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数)

  • 时间:
  • 来源:互联网
  • 文章标签:

1.题目描述

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数”

输入例子: 15

输出例子: 2

2.思路分析

  1. 先写一个返回最小值的函数
  2. 然后设定几个值f0,f1,f(这三个值是寻找Fibonacci区间用的)
  3. right和left是来定最小的值的
  4. 最后一个判断来搞定区间
  5. 如果大于的话,那么这个区间就找到了
  6. 然后比较大小

3.代码实现

#include <iostream>
#include <vector>
using namespace std;

// 最终返回最小的数字
int Min(int a, int b)
{
    if(a < b)
        return a;
    else
        return b;
}

int main()
{
    int N = 0;
    cin >> N;
    // Fibonacci 的三个数
    int f0 = 0;
    int f1 = 1;
    int f;
    
    // 找到存放数字的区间
    int right = 0;
    int left = 0;
    while(1)
    {
        f = f0 + f1;
        f0 = f1;
        f1 = f;
        // 小于的话就一直找,直到大于
        if(f < N)
        {
            left = N - f;
        }
        else
        {
            right = f - N;
            break;
        }
    }
    // 打印出最小值
    cout << Min(right, left);
    return 0;
}

本文链接http://www.taodudu.cc/news/show-83155.html