例题描述
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
数。
给你一个num
,你想让其变为一个Fibonacci
数,每一步你可以把当前数字X
变为X-1
或者X+1
,现在给你一个数num
求最少需要多少步可以变为Fibonacci
数。
- 输入描述:
输入为一个正整数num
(1 ≤ N ≤ 1,000,000) - 输出描述:
输出一个最小的步数变为Fibonacci
数
示例1:
- 输入
15
- 输出
2
解题思路
本题可以通过先找到距离num
最近的两个Fibonacci
数,这两个数分别取自距离num
的最近的左边一个数L
和右边一个数R
,然后通过min(N - L, R - N)
找到最小步数。
代码实现
#include <iostream>
using namespace std;
int main(){
int num,f,f0 = 0,f1 = 1,l = 0,r = 0;
cin >> num;
while(1){
f = f0 + f1;
f0 = f1;
f1 = f;
if(f < num){
l = num - f; //找到比N小且距离N最近的数,求出距离
}else{
r = f - num; //找到比N大且距离N最近的数,求出距离
break;
}
}
cout << min(l,r) << endl; //取最小距离,即二者中最小值
return 0;
}