HDU 1250 Hat's Fibonacci (+=)

#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;
}


你可能感兴趣的:(HDU 1250 Hat's Fibonacci (+=))