1. 程式人生 > >網易筆試程式設計-Fibonacci數列

網易筆試程式設計-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; }

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