Fibonacci 数列(网易2017校招真题)

题目描述:

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

程序(已通过测试用例):

#include <iostream>
#include <cmath>
#define N 32 //事先估算32满足题目范围

//fibonacci初始化
int fibonacci_init(int *,int);
//计算将N变为Fibonacci数需要多少步
int how_many_step(int n, int* arr, int num);


int main() {
	using namespace std;
	int fib_arr[N];	//Fibonacci数列
	fibonacci_init(fib_arr, N);
	int input;
	while (cin >> input) {
		int step = how_many_step(input, fib_arr, N);
		cout << step << endl;
	}
	getchar();
	return 0;
}

int fibonacci_init(int * arr,int n) {
	using namespace std;
	if (n < 2)
		cout << "Error"<<endl;
	arr[0] = 0; arr[1] = 1;
	for (int i = 2; i < n; i++) {
		arr[i] = arr[i - 1] + arr[i - 2];
	}
	return 0;
}

int how_many_step(int n, int* arr, int num) {
	int tmp, ret;
	ret = abs(n - arr[0]);
	for (int i = 0; i < num; i++) {
		tmp = abs(n - arr[i]);
		if (tmp < ret)
			ret = tmp;
	}
	return ret;
}

牛客网优秀代码:

#include <iostream>
using namespace std;
int main(){
    int N,l,r,f0=0,f1=1,f;
    cin >> N;
    while(1){
        f = f0 + f1;
        f0 = f1;
        f1 = f;
        if(f < N) l = N-f;
        else{
            r = f - N;
            break;
        }
    }
    cout << min(l,r) << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/81179152