【Fibonacci数列】Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此

1.【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

#define _CRT_SECURE_NO_WARNINGS 1
#include
int  Fibonacci(int n)
{
	int a = 0, b = 1, c = 0; //0 1 1 2  3 5 8 13 21
	while (1)
	{
		/*if (n == 0)
		{
			break;
		}*/
		c = a + b;
		a = b;
		b = c;
		if (b>= n)
		{
			break;
		}
	}
	int x1 = 0, x2 = 0, min = 0, max = 0;
	max = b;
	min = a;
	x1 = max - n;
	x2 = n - min;
	return x1 > x2 ? x2 : x1;
}
int main()
{
	int N = 0;
	scanf("%d",&N);
	int ret = Fibonacci(N);
	printf("%d ", ret);
	system("pause");
	return 0;
}

结果展示:
【Fibonacci数列】Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此_第1张图片
解题思路:首先根据题的要求由结果来找解题方法,要找出步数,就要找出在Fibonacci数列中N的min和max。找出max和min,就可以通过算数运算找出步数。所以我们需要做的就是实现Fibonacci数列,循环停止的条件就是和n的比较。
这里我们要注意的是不要用递归法,效率太低。

心得体会:我第一次做这个题的时候,没有分析清楚题意,仅仅实现Fibonacci数列。解题一定要分析清楚题意!!!

你可能感兴趣的:(C)