当前位置 博文首页 > Scissors_初夏的博客:初夏小谈:[NK]:Fibonacci数列

    Scissors_初夏的博客:初夏小谈:[NK]:Fibonacci数列

    作者:[db:作者] 时间:2021-08-16 12:56

    题目描述

    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

    解题思路:

    通过循环计算每个斐波那契数字来逼近输入的数字,分别记录离该数最近的小于它的和大于它的。等于是特殊的小于大于。

    代码:

    #include<iostream>
    using namespace std;
    
    int Fibonacci(int num)
    {
    	static int BaseNum = 0;
    	if (num == 0)
    	{
    		return num + 1;
    	}
    	int temp = num;
    	num = num + BaseNum;
    	BaseNum = temp;
    	return num;
    }
    
    int main()
    {
    	int num = 0;
    	int FibNum = 0;
    	int FibNum1 = 0;
    	int FibNum2 = 0;
    	while (cin >> num)
    	{
    		while (1)
    		{
    			if (num > FibNum)
    			{
    				FibNum1 = FibNum;
    				FibNum = Fibonacci(FibNum);
    			}
    			else
    			{
    				FibNum2 = FibNum;;
    				break;
    			}
    		}
    
    		int count1 = num - FibNum1;
    		int count2 = FibNum2 - num;
    		if (count1 < count2)
    		{
    			cout << count1 << endl;
    		}
    		else
    		{
    			cout << count2 << endl;
    		}
    	}
    	return 0;
    }

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 珍&源码

    cs