斐波那契数列就形如:0, 1 ,1,2,3,5,8,13.......等
这些数字被统称为斐波那契数字,给你一个数字N,使它变成一个斐波那契数字,每一步你可以N+1或N-1,试问,至少要多少步才能使它变成一个斐波那契数字。
示例:
输入
15
输出
2
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int s = 0;
int n = 0;
vector<int>f;
f.push_back(0);
f.push_back(1);
for (int i = 2; n < 1000000; i++)
{
n = f[i - 1] + f[i - 2];
f.push_back(n);
}
vector<int>::iterator it = f.begin();
while (cin >> n)
{
for (; it != f.end(); it++)
{
if (n<*it)
{
s = *it - n;
if (s > n - *(it - 1))
{
s = n - *(it - 1);
}
break;
}
}
cout << s << endl;
}
}
以上代码,我觉得有两个重要的点,
第一个是如何把1000000以内的斐波那契数字排列出来,第二个是如何找到与N相邻的斐波那契数字,并计算最少要多少步。
关于第一个,我用了vector数组来完成对斐波那契数字的储存,代码如下:
for (int i = 2; n < 1000000; i++)
{
n = f[i - 1] + f[i - 2];
f.push_back(n);
}
关于第二个,我用迭代器和for遍历循环vector数组,得出最近的斐波那契数字并算出至少要多少步,代码如下:
vector<int>::iterator it = f.begin();
while (cin >> n)
{
for (; it != f.end(); it++)
{
if (n<*it)
{
s = *it - n;
if (s > n - *(it - 1))
{
s = n - *(it - 1);
}
break;
}
}
cout << s << endl;
}