網易筆試程式設計-Fibonacci數列
阿新 • • 發佈:2019-02-19
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數”
輸入例子:
15
輸出例子:
2
演算法分析:
只要我找到給定數兩邊的斐波那契數f1和f2,判斷給定數減去f1和f2減去給定數哪個小,而較小的這個差就是題目要求的輸出。
定義輸入數字為num,初始化第一個斐波那契數字為firstFib = 0,初始化第二個斐波那契數字為secondFib = 1,進入while迴圈,只要num大於secondFib,迴圈就一直進行,迴圈內部,通過firstFib和secondFib可以求出下一個斐波那契數,將現在的secondFib賦值給firstFib,將新求出的斐波那契數字賦值給secondFib,繼續進行迴圈,直到迴圈結束位置。此時,num夾在firstFib和secondFib之間,要想判斷num距離哪個斐波那契數字近,只要將兩數字相減,得到各自的距離,輸出最近的距離即可。
程式程式碼:
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
int num;
cin >> num;
if (num < 0)
{
return 1;
}
int firstFib = 0;
int secondFib = 1;
while(num > secondFib)
{
int newFib = firstFib + secondFib;
firstFib = secondFib;
secondFib = newFib;
}
int step1 = num - firstFib;
int step2 = secondFib - num;
int step;
step = step1 < step2 ? step1 : step2;
cout << step << endl;
return 0;
}
若有錯誤之處,敬請指正。