做过好多斐波那契数列的题了,母牛的故事啊,母猪的故事…
一开始会写循环,可是之后就不会了…都是用递归做了。
下面先来两段,解斐波那契数列的代码(仅仅是函数):
递归:
int f(int n){
if(n == 1) return 1;
else if(n == 2) return 1;
else return f(n-1) + f(n-2);
}
递归的代码都是很简单啊…真好
非递归
int f(int n){
if(n <= 2) return 1;
long f1 = 1, f2 = 1, f3;
for(int i = 3; i <= n; ++i) {
f3 = (f1 + f2);
f1 = f2;
f2 = f3;
}
return f3;
}
这次用递归做踢到石头上了,蓝桥杯入门训练 斐波那契数列…运行超时,运行超时…
然后大佬的帖子都不是递归去做…于是发现递归的时间那么长O(2^n),非递归just O(n)…
见机行事,我就改成非递归呗。
然后数大要取模,第一遍中间没取模(提示已经很清楚了,不用完全算出的)
只是答案取模了,错误。
第二次中间也结果取模了,终于正确了!!!!
这是a的蓝桥杯的第一道题,离比赛还有19天,嘛真费劲啊…时间有点紧张,但是到这个时候不能慌,一步一步来,能做一道是一道!
废话扯远了,再谈一下取模问题。
首先取模特殊,如果一个数c小于mod n(c < n)那么取多少次还是c
所以不用担心取多了, 取少了结果可能还会不正确呢!!!
比如(a + b)% c,展开这样子 得到的是 a%c + b%c,它俩之和还有可能继续取模!,如果不取的话就可能不是想要的答案,所以大胆的多取就对了!
然后就是数据类型了, 因为错的太多次了啊,有点怯,所以我把数据类型开到了long…怂怂哒
下面是ac代码:
#include <iostream>
using namespace std;
long Fibonacci(long n){
if(n <= 2) return 1;
long f1 = 1, f2 = 1, f3;
for(int i = 3; i <= n; ++i) {
f3 = (f1 + f2)%10007;
f1 = f2%10007;
f2 = f3%10007;
}
return f3;
}
int main(){
long n;
cin >> n;
cout << Fibonacci(n)%10007 << endl;
return 0;
}