斐波那契数列的生成 %1e8 后的结果

方法一  用数组开,一般开到1e7,1e8 左右的数组就是极限了   对时间也是挑战

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8+10;
int a[maxn];
int32_t main()
{
    a[1]=1;
    a[2]=1;
    for(int i=3;i<maxn;i++)
    a[i]=a[i-1]%10000000+a[i-2]%100000000;
    cout<<a[maxn-1]<<endl;
}

方法二  求第多少个斐波那契数      时间还是个问题

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8+10;

int32_t main()
{
    int x; x=1000;
    if(x==1) cout<<1<<endl;
    if(x==2) cout<<1<<endl;
    if(x>3)
    {
        int a=1;
        int b=1;
        int c=0;
        for(int i=3;i<=x;i++)
        {
            c=(a+b)%100000000;
            a=b%100000000;
            b=c;
        }
        cout<<c<<endl;
    }
}

方法三 

通项公式             a[n]=1/sqrt(5)  (  ((1+sqrt(5))/2 )^n-((1-sqrt(5))/2)^n  );

这不是重点   重要的是 矩阵 求斐波那契数列

不是很会矩阵    推荐这个博客 https://blog.csdn.net/flyfish1986/article/details/48014523

也可以看我的代码(看了过程再来看比较好)

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int k=1e8; int fj(int n) { if(n==1) return 1; int m=n-2; int a11=1,a12=1,a21=1,a22=0; int t1=1,t2=0; int b11=1,b12=1,b21=1,b22=0;// kau su mi de while(m) { if(m%2==1) { int c11=a11*b11+a12*b21; int c12=a11*b12+a12*b22; int c21=a21*b11+a22*b21; int c22=a21*b12+a22*b22; a11=c11%k; a12=c12%k; a21=c21%k; a22=c22%k; m--; } else if(m%2==0) { int c11=b11*b11+b12*b21; int c12=b11*b12+b12*b22; int c21=b21*b11+b22*b21; int c22=b21*b12+b22*b22; b11=c11%k; b12=c12%k; b21=c21%k; b22=c22%k; m=m/2; } } return a11; } int32_t main() { int n; cin>>n; int c=fj(n); cout<<c<<endl; }

 

转载于:https://www.cnblogs.com/Andromeda-Galaxy/p/9516915.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值