题目:
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
解题思路:
首先要能写出斐波那契数列 然后给定一个输入的数 将这个输入的数与斐波那契数列作比较
这里给出左区间距离 和 右区间距离 最后返回小的那部分
代码展示:
#include <iostream>
using namespace std;
int Fib(int n) {
if (n == 0) {
return 0;
}
else if (n == 1) {
return 1;
}
else {
return Fib(n - 1) + Fib(n - 2);
}
}
int Min_step_To_Fib(int num) {
int n = 0;
int left = 0;
int right = 0;
while (1) {
if (Fib(n) < num) {
left = num - Fib(n);
}
else {
right = Fib(n) - num;
break;
}
n++;
}
if (left < right) {
return left;
}
return right;
}
int main() {
int n;
cin >> n;
cout << Min_step_To_Fib(n);
system("pause");
return 0;
}
部分代码解析:
int Fib(int n) {
if (n == 0) {
return 0;
}
else if (n == 1) {
return 1;
}
else {
return Fib(n - 1) + Fib(n - 2);
}
}
尤为重要的一点是要能写出这个斐波那契数列的递归实现函数
然后循环从Fib(0)开始 用left和right记录与输入的那个数的差值 最后输出差值小的那一个
斐波那契数列的优化:
int Fibonacci2(int n) {
int *buf = new int[n];
buf[0] = 0;
buf[1] = 1;
for (int i = 2;i <= n;i++) {
buf[i] = buf[i - 1] + buf[i - 2];
}
delete[] buf;
return buf[n];
}