杭电ACM1005题Runtime error

#include<iostream>#include<vector>usingnamespacestd;intgetresult(intnumber1,intnumber... #include<iostream>
#include<vector>
using namespace std;
int getresult(int number1,int number2,int n)
{
if(n==1)
return 1;
else if(n==2)
return 1;
else
{
return (number1*getresult(number1,number2,n-1)+number2*getresult(number1,number2,n-2))%7;
}
}

int main()
{
int number1,number2,result,n;
vector<int> vec;
vector<int>::iterator iter;
while((cin>>number1>>number2>>n)&&((number1!=0)||(number2!=0)||(n!=0)))
{
result=getresult(number1,number2,n);
vec.push_back(result);
}
for(iter=vec.begin();iter!=vec.end();iter++)
{
cout<<*iter<<endl;
}
}
我想问为什么会溢出?有什么其他好的解决方法?
展开
 我来答
东邪箫醉
2012-09-25 · TA获得超过331个赞
知道小有建树答主
回答量:129
采纳率:100%
帮助的人:131万
展开全部
递归导致爆栈了。由于每次递归都需要保存当前信息,压入栈中,所以当递归次数过多时,栈内存就不够用了。你可以测一下,递归次数在几十次就会爆栈的。
这个题目是数学题。
首先,必然有f(n)∈{0,1,2,3,4,5,6}这个结论。递推式本质就是用两个0到6的数来确定一个值。这两个数,一共有49种组合。所以超过49次递推后,必然面临前面出现过的情形,这样导致递推循环了。
下面的程序用fn来找到第二次出现相邻的两个1时的循环节长度loop,之后的计算就简化了。
#include <stdio.h>
int fn(int A,int B);
int a[100];
int main() {
int A,B,loop;
int n;
while(scanf("%d%d%d",&A,&B,&n)!=EOF&&n!=0)
{
loop=fn(A,B);
n--;
n%=loop;
printf("%dn",a[n]);
}
return 0;
}
int fn(int A,int B) {
int i;
a[0]=a[1]=1;
for(i=2;i<52;i++) {
a[i] = (A*(a[i-1])+B*(a[i-2]))%7;
if(a[i]==1&&a[i-1]==1)
break;
}
return i-1;
}
很多人,直接loop=49就行了,每次不用求循环节。
更多追问追答
追问
n--;??
i
using namespace std;
int a[50];
int main()
{
int A,B,i,n;
a[1]=1;a[2]=1;
while(scanf("%d%d%d",&A,&B,&n)!=EOF &&A&&B&&n)
{
A%=7;B%=7;
for(i=3;i<49;i++)
{
a[i]=(A*a[i-1]+B*a[i-2])%7;
}
cout<<a[n%48]<<endl;
}
}
追答
抱歉,我的少了一条斜线……
改为printf("%d\n",a[n]);

因为这道题有bug,不会出现0,若果A,B均为7的倍数的话,则数列为1,1,0,0,0……上面的程序会出错的。所以该题测试数据的实际循环节没有49那么长……
百度网友28b4182
2012-09-25 · TA获得超过7223个赞
知道大有可为答主
回答量:4847
采纳率:100%
帮助的人:1885万
展开全部
递归太深了,正解是矩阵乘法。
追问
能给一下代码不?或是讲一下原理……
追答
这个题目网上有解题报告的。你搜索一下。这儿发不了代码
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
try_ok
2012-09-25 · TA获得超过211个赞
知道小有建树答主
回答量:423
采纳率:0%
帮助的人:263万
展开全部
你没有resize啊 vec.resize(大小)
更多追问追答
追问
为什么要resize()?
追答
就是要申请一个大小的空间嘛,就跟数组一样,
vec.push_back(result);这一直存数据,你没有申请那么大的空间,怎么存呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式