斐波那契序列:C与Python
这是我用C写的斐波那契序列代码:斐波那契序列: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;
#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中工作得很好),但我有两个主要问题:
fib
?换句话说,除了使用double(double有其自身的限制),我如何计算C中的fib
C不直接提供任何动态大小的整数类型。在语言本身中,最大的限制是
long
。然而,没有什么能阻止您编写自己的大整数函数,这些函数根据需要分配内存和处理进位。
或者,您可以使用其他人的大整数库,例如
(查看BigInt的源代码也将回答Python是如何做到这一点的问题。)
编辑:我只是对BigInt做了一个更仔细的观察。请注意,它无条件地使用常规的纸笔法进行乘法,这对于“小”数字来说是快速的,但是对于“大”数字,它的性能比该方法差。但是请注意,在这种情况下,“小”和“大”之间的界限可能很高,以至于在大多数实际情况下,纸笔方法就足够了(请参阅链接的Wiki文章)。还值得注意的是,您可以将这两种算法结合起来进行乘法运算,方法是递归编写它们,如果位数低于给定的阈值,则让Karatsuba的方法回到纸笔上。C不直接提供任何动态大小的整数类型。在语言本身中,最大的限制是
long
。然而,没有什么能阻止您编写自己的大整数函数,这些函数根据需要分配内存和处理进位。
或者,您可以使用其他人的大整数库,例如
(查看BigInt的源代码也将回答Python是如何做到这一点的问题。)
编辑:我只是对BigInt做了一个更仔细的观察。请注意,它无条件地使用常规的纸笔法进行乘法,这对于“小”数字来说是快速的,但是对于“大”数字,它的性能比该方法差。但是请注意,在这种情况下,“小”和“大”之间的界限可能很高,以至于在大多数实际情况下,纸笔方法就足够了(请参阅链接的Wiki文章)。还值得注意的是,您可以将这两种算法结合起来进行乘法运算,方法是递归编写它们,如果位数低于给定的阈值,则让Karatsuba的方法返回到笔和纸上。@Ctznkane525相反,它以n-1结束,序列只是移位。如果运行代码,它们都有相同的输出(对于较小的值)。@Ctznkane525相反,它以n-1结尾,序列只是移位。如果您运行代码,它们都有相同的输出(对于小值)。
或者您可以使用其他人的大整数库,例如
,或者您可以使用其他人的大整数库,例如
1556111435
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875