读书人

为什么爆内存,该如何解决

发布时间: 2012-05-06 16:15:43 作者: rapoo

为什么爆内存
下面的代码帮忙看下,不用管是什么用的,我认为爆栈可以理解成数组开大了或小了,或这运行过程中占用了太多数组
最少也能把数据输入吧,但是我调试下面的程序,刚刚debug输入,他就提示segmentation fault,测试数据1995 1 1
大家直接调试吧 就能看出问题吧 谢谢大家了

[code=C/C++][/code]#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int nleap[13]= {31,28,31,30,31,30,31,31,30,31,30,31};
int leap[13]= {31,29,31,30,31,30,31,31,30,31,30,31};
int SG[38000];

int Is_leap(int a)
{
if((a%4==0 && a%100!=0) || a%400==0) return 1;
return 0;
}

int count(int year,int month,int day)
{
int sum=0,i,j;
for (i=year; i<=2001; i++)
{
if(i==year) j=month;
else j=1;
if(Is_leap(i))
{
for (;j<=12; j++)
{
sum+=leap[j-1];
}
sum-=day;
}
else
{
for (;j<=12; j++)
{
sum+=nleap[j-1];
}
sum-=day;
}
}
sum-=57;
return sum;
}

int get_SG(int a,int year,int month,int day)
{
int temp,i;
int judge[1000]= {0};
int m,y,d;
m=month; y=year; d=day;
for (i=0; i<2; i++)
{
if(i==0)//明天
{
temp=a-1;
if(temp<0) break;
if(Is_leap(year))
{
if(month==12 && leap[11]==day)
{
year+=1;
month=1;
day=1;
}
else if(month!=12 && leap[month-1]==day)
{
month+=1;
day=1;
}
else day+=1;
}
else
{
if(month==12 && nleap[11]==day)
{
year+=1;
month=1;
day=1;
}
else if(month!=12 && nleap[month-1]==day)
{
month+=1;
day=1;
}
else day+=1;
}
}
else//下个月同一天
{
if(Is_leap(year))
{
if(day>leap[month%12])//只能明天
{
temp=a-1;
if(temp<0) break;
if(month==12 && leap[11]==day)
{
year+=1;
month=1;
day=1;
}
else if(month!=12 && leap[month-1]==day)
{
month+=1;
day=1;
}
}
else
{
temp=a-nleap[month-1];//跳到下一个月
if(temp<0) break;
if(month==12) year+=1;
month+=1; if(month==13) month=1;
}

}
else


{
if(day>nleap[month%12])
{
temp=a-1;
if(temp<0) break;
if(month==12 && nleap[11]==day)
{
year+=1;
month=1;
day=1;
}
else if(month!=12 && nleap[month-1]==day)
{
month+=1;
day=1;
}
}
else
{
temp=a-nleap[month-1];
if(temp<0) break;
if(month==12) year+=1;
month+=1; if(month==13) month=1;
}

}
}
if(SG[temp]==-1) SG[temp]=get_SG(temp,year,month,day);
judge[SG[temp]]=1;
year=y; day=d; month=m;
}
for (i=0;;i++)
if(judge[i]==0) return i;
}

int main()
{
int T;
int month,year,day,ans;
memset(SG,-1,sizeof(SG));
scanf("%d",&T);
while(T--)
{
int sum=0;
scanf("%d%d%d",&year,&month,&day);
sum=count(year,month,day);
ans=get_SG(sum,year,month,day);
if(ans) printf("YES\n");
else printf("NO\n");
}
return 0;
}




[解决办法]
断点后单步调试一下吧......

这样看着累啊~
[解决办法]
for (i=0;;i++)
if(judge[i]==0) return i;

这是什么意思??
没条件?

栈出错了,可能是递归太深了. 用个变量控制下递归的深度试试
[解决办法]

探讨

for (i=0;;i++)
if(judge[i]==0) return i;

这是什么意思??
没条件?

栈出错了,可能是递归太深了. 用个变量控制下递归的深度试试

读书人网 >C++

热点推荐