解释Fibonacci代码

时间:2015-04-11 16:58:34

标签: c

#include<stdio.h>
#define max 2000

int arr1[max], arr2[max], arr3[max];

void fib();

int main()
{
    int num, i, j, flag = 0;

    for(i = 0; i<max; i++)
        arr1[i] = arr2[i] = arr3[i] = 0;

    arr2[max - 1] = 1;

    printf("Enter the term  : ");
    scanf("%d", &num);

    for(i = 0; i<num; i++)
    {
        fib();

        if(i == num - 3)
            break;

        for(j = 0; j<max; j++)
            arr1[j] = arr2[j];

        for(j = 0; j<max; j++)
            arr2[j] = arr3[j];

    }

    for(i = 0; i<max; i++)
    {
        if(flag || arr3[i])
        {
            flag = 1;
            printf("%d", arr3[i]);
        }
    }


    getch();
    return 1;
}

void fib()
{
    int i, temp;
    for(i = 0; i<max; i++)
        arr3[i] = arr1[i] + arr2[i];

    for(i = max - 1; i>0; i--)
    {
        if(arr3[i]>9)
        {
            temp = arr3[i];
            arr3[i] %= 10;
            arr3[i - 1] += (temp / 10);
        }
    }
}

以上代码生成第n个Fibonacci数。我无法理解这是如何工作的。基本上,斐波纳契数存储在一个非常大的数组arr3[]中。

请解释此代码中涉及的逻辑。

fib()功能如何运作?

3 个答案:

答案 0 :(得分:1)

这是一个简单的Fibonacci循环。

#include <stdio.h>

int main()
{
    int term = 20, last2=0, last1=1, fib, i;
    for (i=0; i<term; i++) {
        fib = last2 + last1;
        last2 = last1;
        last1 = fib;
    }
    printf ("Term %d = %d\n", i, fib);
    return 0;
}

节目输出:

Term 20 = 10946

虽然关于序列的起始位置有多个想法。

答案 1 :(得分:1)

原始帖子中的示例代码通过在每个数组中每个元素存储1个十进制数来处理大数字。它初始化arr [3] = arr2 [] = arr1 [] = 0,然后是arr2 [] = 1.在循环中,fib()执行arr3 [] = arr1 [] + arr2 []的一个实例,处理进位,然后循环执行arr [1] = arr2 [],arr2 [] = arr3 []。如果num&lt;如图3所示,for循环在循环条件i&lt; num,如果n> = 3,则当i ==(num-3)时循环退出。 (这可以避免)。打印循环跳过arr3 []中的前导零,一旦找到非零值就设置标志。代码需要一些小修复。这是一个固定的例子。请注意,getch()在某些环境中可能是_getch()(来自conio.h)。下面的第二个示例仅使用两个数组。从0开始的斐波纳契数是0 1 1 2 3 5 8 ...

#include <conio.h>
#include <stdio.h>
#define max 2000

int arr1[max], arr2[max], arr3[max];

void fib();

int main()
{
    int num, i, j;
    for(i = 0; i<max; i++)
        arr1[i] = arr2[i] = arr3[i] = 0;
    arr1[max - 1] = 1;

    printf("Enter the term  : ");
    scanf("%d", &num);

    for(i = 0; i<num; i++)
    {
        fib();
        for(j = 0; j<max; j++)
            arr1[j] = arr2[j];
        for(j = 0; j<max; j++)
            arr2[j] = arr3[j];
    }

    for(i = 0; i < max-1; i++)
        if(arr3[i])
            break;
    for( ; i < max; i++)
        printf("%d", arr3[i]);

    getch();
    return 0;
}

void fib()
{
    int i, temp;
    for(i = 0; i<max; i++)
        arr3[i] = arr1[i] + arr2[i];

    for(i = max - 1; i>0; i--)
    {
        if(arr3[i]>9)
        {
            temp = arr3[i];
            arr3[i] %= 10;
            arr3[i - 1] += (temp / 10);
        }
    }
}

这个例子只使用两个数组,交替哪个数组包含总和(a1 + = a0,a0 + = a1)。它使用Duff's device进入循环。由于数字+数字+进位的最大总和是&lt; 20,fib()中的进位循环被简化了。

#include <conio.h>
#include <stdio.h>
#define max 2000

void fib(unsigned char *a0, unsigned char *a1);

int main()
{
unsigned char a0[max], a1[max];

    size_t i;
    int n;
    printf("Enter the term  : ");
    scanf("%d", &n);
    for(i = 0; i < max; i++)
        a0[i] = a1[i] = 0;
    a0[max-1] = n & 1;          /* if n even, a0=0=fib(0), a1=1=fib(-1) */
    a1[max-1] = 1 - a0[max-1];  /* if n odd,  a1=0=fib(0), a0=1=fib(-1) */
    switch(n&1){
        do{
            fib(a0, a1);
          case 1:
            fib(a1, a0);
          case 0:
            continue;
        }while(0 <= (n -= 2));
    }
    for(i = 0; i < max-1; i++)
        if(a0[i])break;
    for( ; i < max; i++)
        printf("%d", a0[i]);
    getch();
    return 0;
}

void fib(unsigned char *a0, unsigned char *a1)
{
    size_t i;
    for(i = 0; i < max; i++)
        a1[i] += a0[i];
    for(i = max - 1; i > 0; i--){
        if(a1[i] >= 10){
            a1[i]   -= 10;
            a1[i-1] += 1;
        }
    }
}

答案 2 :(得分:0)

这是斐波那契系列的更好实现

#include<iostream>

using namespace std;

 main()
 {
    int n, c, first = 0, second = 1, next;

    cout << "Enter the number of terms of Fibonacci series you want" << endl;
    cin >> n;

    cout << "First " << n << " terms of Fibonacci series are :- " << endl;

    for ( c = 0 ; c < n ; c++ )
    {
       if ( c <= 1 )
       next = c;
       else
       {
          next = first + second;
          first = second;
          second = next;
       }
       cout << next << endl;
    }

    return 0;
 }