網易筆試編程-Fibonacci數列

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;
}

若有錯誤之處,敬請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章