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

详细题目如下题目


一千位斐波那契数

斐波那契数列是按如下递归关系定义的数列:
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

### 回答1: 可以使用数组来处理Fibonacci数列,具体步骤如下: 1. 定义一个数组来存储Fibonacci数列数组的长度可以根据需要进行调整。 2. 初始化数组的前两个元素为和1,即Fibonacci数列的前两个数。 3. 使用循环结构来计算Fibonacci数列的后续元素,每个元素都是前两个元素之和。 4. 输出数组中的所有元素,即为Fibonacci数列。 下面是一个示例代码: ``` int[] fibonacci = new int[10]; fibonacci[] = ; fibonacci[1] = 1; for (int i = 2; i < fibonacci.length; i++) { fibonacci[i] = fibonacci[i-1] + fibonacci[i-2]; } for (int i = ; i < fibonacci.length; i++) { System.out.print(fibonacci[i] + " "); } ``` 这段代码将输出Fibonacci数列的前10个数: 1 1 2 3 5 8 13 21 34。 ### 回答2: 斐波那契数列的定义为:前两为0和1,从第三开始每个数都等于前两个数之和。用数学公式表示为:f[0]=0, f[1]=1, f[i]=f[i-1]+f[i-2] (i>=2)。 在编程中,我们可以用数组来处理斐波那契数列。具体操作如下: 首先,定义一个整型数组来存储斐波那契数列。为了方便计算,我们可以将数组长度设置为要输出的斐波那契数列数。 接着,在数组中初始化前两个数,即f[0]=0, f[1]=1。 然后,通过循环来计算数组中剩余的数。在每次循环时,先将当前数的前两个数相加,然后将结果存储到当前数的位置上。 最后,我们可以通过循环输出整个数组来输出斐波那契数列。 以下是具体代码实现: int main() { int n; // 求斐波那契数列数 cin >> n; int f[n]; f[0] = 0; // 初始化第一 f[1] = 1; // 初始化第二 for (int i = 2; i < n; i++) { f[i] = f[i-1] + f[i-2]; // 计算后续数 } for (int i = 0; i < n; i++) { cout << f[i] << " "; // 输出斐波那契数列 } return 0; } 在运行程序时,用户可以输入一个整数n表示要输出的斐波那契数列数。程序会自动计算斐波那契数列,并将结果输出到屏幕上。例如,若用户输入n=10,则程序会输出:0 1 1 2 3 5 8 13 21 34。 ### 回答3: 斐波那契数列是一个经典的数列,它的第n个数是前两个数之和。斐波那契数列的前几个数是0、1、1、2、3、5、8、13等。如果要处理斐波那契数列,可以使用数组来存储和处理这些数字。 在使用数组来处理斐波那契数列时,首先需要创建一个数组来存储这些数字。可以使用如下代码来创建一个包含10个数字的数组: int[] fibArray = new int[10]; 接下来,需要将数组中的前两个数字初始化为0和1,然后使用循环来计算数组中的其他数字。可以使用如下代码来计算斐波那契数列中的数字: fibArray[0] = 0; fibArray[1] = 1; for (int i = 2; i < fibArray.Length; i++) { fibArray[i] = fibArray[i - 1] + fibArray[i - 2]; } 这段代码将数组的第一个数字设置为0,第二个数字设置为1,并使用循环来计算剩余的数字。在循环中,每个数字都是前两个数字之和,即fibArray[i] = fibArray[i - 1] + fibArray[i - 2]。 最后,可以使用循环来输出数组中的所有数字,如下所示: for (int i = 0; i < fibArray.Length; i++) { Console.WriteLine(fibArray[i]); } 这段代码将数组中的每个数字都输出到控制台上。 使用数组来处理斐波那契数列非常简单,只需要创建一个数组,初始化前两个数字,然后使用循环来计算剩余的数字,最后使用循环来输出数组中的所有数字即可。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值