求fibonnaci数列的偶数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[4000000];
int sum=0;
int i;
for(i=0;i<4000000;i++)
{
if(i==0)
{
a[0]=1;
}
else if(i==1)
{
a[1]=2;
}
else
{
a[i]=a[i-1]+a[i-2];
}
if(a[i]%2==0)
{
sum+=a[i];
}
//printf("a[%d]=%d\n",i,a[i]);
}
printf("sum=%d\n",sum);//
return 0;
}当我为a=10运行compile.But时,这段代码崩溃了。我尝试将类型更改为unsigned long long,并将格式说明符更改为%llu,但即使我将主数据类型更改为unsigned long long,代码仍会崩溃。我认为数字4000000对于int类型来说太大了,但当我搜索时,我从他的网站上的其他用户那里得到了以下代码
// Simple Program to print Fibonacci series in Console
#include <stdio.h>
int main() {
int x=1,y=2,sum=0,limit=0,i=0,temp=0;
printf("Enter Limit:");
scanf("%d",&limit);
if(limit==1)
printf("%d",x);
else if(limit>1) {
printf("%d %d",x,y);
if (limit>2) {
while (i<limit-2) {
temp=y;
sum=x+y;
x=temp;
y=sum;
printf(" %d",sum);
i++;
}
}
}
printf("\n");
return 0;
}这段代码运行良好,我是一个初学者,一个自学成才的人,我不知道我的代码出了什么问题,是不是因为我使用了array.Please帮助来纠正这个问题。谢谢。
发布于 2018-05-20 18:45:05
大多数实现对堆栈帧的大小有相当小的限制。如果您需要大型数组,请将其设置为静态或动态分配。
static int a[4000000];发布于 2018-05-20 18:46:16
在大多数系统中,局部变量都是在堆栈上分配的。堆栈的大小有限,因此创建一个巨大的数组作为局部变量将使堆栈溢出。
而应使用动态内存,如:
int* a = malloc(4000000 * sizeof *a);
if (a == NULL)
{
// no more memory
exit(1);
}
// Now a can be used as an array, e.g. a[1234] = 42
... put your code here
// When done, deallocate memory like:
free(a);也就是说,使用这么大的数组是没有意义的。简单的整数类型不能保存那么多斐波那契数的值。在计算中会有整数溢出,并且您的结果将是错误的。您可以使用int a[100];进行检查,然后打印计算值。你很快就会发现他们错了。
发布于 2018-05-20 19:36:41
如果你必须(出于某些原因)才能使用自动存储变量--增加堆栈的大小。
例如,这样做:
int SeStack(rlim_t size)
{
struct rlimit rlim;
if(!getrlimit(RLIMIT_STACK, &rlim))
{
if (rlim.rlim_cur <= size)
{
rlim.rlim_cur = size;
return setrlimit(RLIMIT_STACK, &rlim);
}
else
{
return 0;
}
}
return EPERM;
}https://stackoverflow.com/questions/50433969
复制相似问题