Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
斐波那契序列:C与Python_Python_C_Fibonacci - Fatal编程技术网

斐波那契序列:C与Python

斐波那契序列:C与Python,python,c,fibonacci,Python,C,Fibonacci,这是我用C写的斐波那契序列代码: #include <stdio.h> #include <stdlib.h> int fib(int n) { int a = 0, b = 1, c, i; if (n == 0) return a; for (i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b;

这是我用C写的斐波那契序列代码:

#include <stdio.h>
#include <stdlib.h>

int fib(int n)
{
    int a = 0, b = 1, c, i;
    if (n == 0)
        return a;
    for (i = 2; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}

int main()
{
    printf("%d",fib(1000));
    return 0;
}

C程序输出:

    1556111435
其中Python(正确)输出:

我意识到C的问题在于变量类型(因为
fib(50)
在C中工作得很好),但我有两个主要问题:

  • 我应该如何修正C程序,使其能够计算任意数的
    fib
    ?换句话说,除了使用double(double有其自身的限制),我如何计算C中的
    fib

  • Python如何处理这个问题?因为很明显,它对整数的大小没有限制


  • C不直接提供任何动态大小的整数类型。在语言本身中,最大的限制是
    long
    。然而,没有什么能阻止您编写自己的大整数函数,这些函数根据需要分配内存和处理进位。 或者,您可以使用其他人的大整数库,例如

    (查看BigInt的源代码也将回答Python是如何做到这一点的问题。)


    编辑:我只是对BigInt做了一个更仔细的观察。请注意,它无条件地使用常规的纸笔法进行乘法,这对于“小”数字来说是快速的,但是对于“大”数字,它的性能比该方法差。但是请注意,在这种情况下,“小”和“大”之间的界限可能很高,以至于在大多数实际情况下,纸笔方法就足够了(请参阅链接的Wiki文章)。还值得注意的是,您可以将这两种算法结合起来进行乘法运算,方法是递归编写它们,如果位数低于给定的阈值,则让Karatsuba的方法回到纸笔上。

    C不直接提供任何动态大小的整数类型。在语言本身中,最大的限制是
    long
    。然而,没有什么能阻止您编写自己的大整数函数,这些函数根据需要分配内存和处理进位。 或者,您可以使用其他人的大整数库,例如

    (查看BigInt的源代码也将回答Python是如何做到这一点的问题。)


    编辑:我只是对BigInt做了一个更仔细的观察。请注意,它无条件地使用常规的纸笔法进行乘法,这对于“小”数字来说是快速的,但是对于“大”数字,它的性能比该方法差。但是请注意,在这种情况下,“小”和“大”之间的界限可能很高,以至于在大多数实际情况下,纸笔方法就足够了(请参阅链接的Wiki文章)。还值得注意的是,您可以将这两种算法结合起来进行乘法运算,方法是递归编写它们,如果位数低于给定的阈值,则让Karatsuba的方法返回到笔和纸上。

    @Ctznkane525相反,它以n-1结束,序列只是移位。如果运行代码,它们都有相同的输出(对于较小的值)。@Ctznkane525相反,它以n-1结尾,序列只是移位。如果您运行代码,它们都有相同的输出(对于小值)。
    或者您可以使用其他人的大整数库,例如
    ,或者您可以使用其他人的大整数库,例如
        1556111435
    
        43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875