算法题牛刀小试——Fibonacci数列

Posted trytoreachpeak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题牛刀小试——Fibonacci数列相关的知识,希望对你有一定的参考价值。

题目

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

数据规模与约定

1 <= n <= 1,000,000。

正确答案

#include <iostream>
using namespace std;

int main() {
	int n = 0;
	int i = 2;
	cin >> n;
	if (n>=1 && n<= 1000000){   //可有可无
		int now = 1;
		int last = 1;
		while(i < n){
			int temp = now;
			now += last;
			now %= 10007;
			last = temp;
			++i;
		}
		cout<< now;
	}
	return 0;
}

在百度上搜到的很多答案都太复杂了。居然还利用数组?

反思和易错点

1.一定要注意输出格式,cout后面不能再跟endl,否则会多输出一行。
2.注意输入范围,n大于1所以当n=1,n=2时会cout两个1。
3.本题最关键的地方,在于类型的选择以及数据规模的判断,在本题中,当n>>45时,数据规模会超过int(4字节)的范围,从而让结果变成负数,即使改成了long long,也不足以支撑数据的范围,因此需要在斐波那契数列的数字大于等于10007时,直接取余10007,即使这样也不会影响输出结果(先计算Fn再取余跟每次求Fn之前取余是等效的),而且能够保证Fn<10007,从而将范围控制在10007以内,用int类型足以存储。




以上是关于算法题牛刀小试——Fibonacci数列的主要内容,如果未能解决你的问题,请参考以下文章

c语言经典算法---计算Fibonacci数列

算法题4 斐波那契数列

Sum All Odd Fibonacci Numbers-freecodecamp算法题目

常用算法——Fibonacci数列问题

Fibonacci 数列第 N项 O(logN)算法

面试题9-斐波那契数列