#include <stdio.h>
int p[8000][255]={0};
int i,n,j;
int main() //大数加法
{
for (i=1;i<5;i++)
{
p[i][1]=1;
}
for (;i<8000;i++)
{
for (j=1;j<255;j++)
{
p[i][j]+=p[i-1][j]+p[i-2][j]+p[i-3][j]+p[i-4][j];
p[i][j+1]+=p[i][j]/100000000;
p[i][j]%=100000000;
}
}
while (scanf("%d",&n)!=EOF)
{
j=254;
while (j>0)
if(p[n][--j]) break;
printf("%d",p[n][j--]);
while (j>=1)
{
printf("%08d",p[n][j--]); //08不能少,我经常会犯这样的错误
}
printf("\n");
}
return 0;
}
大数组定义在main函数中不能执行,为什么将其定义为全局变量就可以执行?
数组定义在函数中时,占用的内存来自栈空间,栈空间是在进程创建时初始化的,有固定的大小,一般为几十KB,所以太大的数组会耗光栈空间。
而全局变量占用的堆空间,堆空间中的内存是按需分配,自由增长的,可以非常大,32位的系统中可以大到4GB。 堆空间是malloc()的。 全局变量是在编译的时候编到数据段的,可以比较大。
代码二;2015 7 11 重做
#include <iostream>
using namespace std;
int fib[8000][301];
void caulate()
{
for (int i=5;i<8000;i++)
{
for (int j=1;j<300;j++)
{
fib[i][j] += fib[i-1][j]+fib[i-2][j]+fib[i-3][j]+fib[i-4][j];//注意+=而不是=
fib[i][j+1] += (fib[i][j]/10000000);
fib[i][j] %= 10000000;
}
}
}
int main()
{
fib[1][1]=fib[2][1]=fib[3][1]=fib[4][1]=1;
int n,i;
caulate();
while (cin>>n)
{
i=299;
while (!fib[n][i])
i--;
cout<<fib[n][i--];
for (;i>=1;i--)
{
printf("%07d",fib[n][i]);
}
cout<<endl;
}
return 0;
}