斐波那契数列 Fn 的定义为:对 n≥0 有 Fn+2=Fn+1+Fn,初始值为 F0=0 和 F1=1。所谓与给定的整数 N 最近的斐波那契数是指与 N 的差之绝对值最小的斐波那契数。
本题就请你为任意给定的整数 N 找出与之最近的斐波那契数。
输入格式:
输入在一行中给出一个正整数 N(≤108)。
输出格式:
在一行输出与 N 最近的斐波那契数。如果解不唯一,输出最小的那个数。
输入样例:
305
输出样例:
233
样例解释
部分斐波那契数列为 { 0, 1, 1, 2, 3, 5, 8, 12, 21, 34, 55, 89, 144, 233, 377, 610, ... }。可见 233 和 377 到 305 的距离都是最小值 72,则应输出较小的那个解。
解题思路:
第一种方法:
10^8以内的斐波那契数列一共有43个元素加上最大的一共44个元素
直接遍历即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int num;
cin >> num;
int min = 100000005;
int res;
set<int> s = {1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170};
for(auto elem : s)
{
if(abs(elem-num) < min)
{
min = abs(elem-num);
res = elem;
}
}
cout << res;
}
第二种方法:
因为斐波那契数列是一个递增数列,所以只要前面数的距离大于等于后面的数的距离,那么后面的数就是结果。
其中启示的两个值必需是1,2,因为有算法只在递增数列下成立
#include <bits/stdc++.h>
using namespace std;
int main()
{
int num;
cin >> num;
int a,b = 2,c = 1;
while(true)
{
a = b+c;
if(abs(b-num) >= abs(c-num))
{
cout << c;
return 0;
}
c = b;
b = a;
}
}