斐波那契数列 (蓝桥)

7 篇文章 0 订阅
3 篇文章 0 订阅

做过好多斐波那契数列的题了,母牛的故事啊,母猪的故事…
一开始会写循环,可是之后就不会了…都是用递归做了。
下面先来两段,解斐波那契数列的代码(仅仅是函数):

递归

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;

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值