使用循环数组解决 斐波那契数列问题

5 篇文章 0 订阅

详细题目如下题目


一千位斐波那契数

斐波那契数列是按如下递归关系定义的数列:
F1 = 1 F2 = 1
Fn = Fn−1 + Fn−2

因此斐波那契数列的前12项分别是:
F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144

第一个有三位数字的项是第12项F12。

在斐波那契数列中,第一个有1000位数字的是第几项?


其实我们就需要解决两个问题

  1. 如何使用循环数组解决斐波那契数列问题
  2. 如何实现大整数相加

代码如下

/*************************************************************************
	> File Name: try.2.c
	> Author:Gin.TaMa 
	> Mail:1137554811@qq.com 
	> Created Time: 2019年01月06日 星期日 19时00分50秒
 ************************************************************************/

#include<stdio.h>
#define max 1000
int Fib[2][max + 5] = {0};
void add(int * a,int * b){
    b[0] = b[0] > a[0] ? b[0]:a[0];
    for(int i = 1;i <= b[0];i ++){
        b[i] += a[i];
        // 完成大整数的相加 处理进位
        if(b[i] < 10)continue;
        b[i + 1] += b[i] / 10;
        b[i] %= 10;
    }
    if(b[b[0] + 1])b[0]++;
}
int main(){
    int n = 0;
    Fib[0][0] = Fib[1][0] = 1;
    Fib[0][1] = 1;
    while(Fib[(n+1) % 2][0] < 1000){
        n ++;
        add(Fib[n%2],Fib[(n + 1)%2]);
    }
    printf("%d\n",n);
}

大整数相加还是很好实现的,在相加的同时处理一下进位问题就OK了

这个问题的关键是在循环数组与n的对应关系上

就是这个题目最后是输出n还是n+1还是n+2

不要被% 2的运算迷惑了,本质上循环数组就用%运算模拟了一个完整的数组

只不过这个n取决与初始的定义

我是定义 n = 0时 对应的数列为值为F0的值 0

所以当循环结束的时候指向的就是第n项

没有对比就没有意思

这样

看另一份代码

int main(){
    int n = 0;
    Fib[0][0] = Fib[1][0] = 1;
    Fib[0][1] = 1;
    Fib[1][1] = 2;//修改部分
    while(Fib[(n+1) % 2][0] < 1000){
        n ++;
        add(Fib[n%2],Fib[(n + 1)%2]);
    }
    printf("%d\n",n+3);//结果调整
}

我修改了定义 n=0的时候判断的F3

所以最后就输出n+3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值