利用循环队列编写求k阶斐波那契序列中第n+1项fn的算法
##记录一下自己做题时的历程
错误示例:
SqQueue Q;
Q.base=(ElemType )malloc(ksizeof(ElemType));
Q.maxSize=k;
Q.front=Q.rear=0;
if(k<1||Q.maxSize<1)return ERROR;//错误情况
if(n<k-1)return 0;//小于k-1的情况
else{
int c=0;
while (c<k)
Q.base[c++]=0;//置零
int i=k-1,j=0,b;
while (i<=n)
{
for( int x=1;x<k;x++)
{
Q.base[Q.rear]+=Q.base[(Q.rear+x)%k];
if(i==k-1) Q.base[Q.rear]=1;
}
Q.rear=(Q.rear+1)%k;
i++;
}
return Q.base[(Q.rear-1)%k];
}
如上,这里只写了部分代码,写的时候大多时间都耗费在后面的找错误上,在anyview上·出错老是为零,但可以发现大部分都是对的,而且连较大的数都能得出正确的答案,因此排除错误出在主要的计算过程,写的时候感觉后面输出不大对劲,又懒得去找具体是怎样的错误,干脆直接把不对劲的点改掉(虽然不知道错的原理)
以下为改正过的:
SqQueue Q;
Q.base=(ElemType *)malloc(k*sizeof(ElemType));
Q.maxSize=k;
Q.front=Q.rear=0;
if(k<1||Q.maxSize<1)return ERROR;//错误情况
if(n<k-1)return 0;//小于k-1的情况
else{
int c=0;
while (c<k)
Q.base[c++]=0;//置零
int i=k-1,j=0,b;
while (i<=n)
{
for( int x=1;x<k;x++)
{
Q.base[Q.rear]+=Q.base[(Q.rear+x)%k];
if(i==k-1) Q.base[Q.rear]=1;
}
if(i<n-1) Q.rear=(Q.rear+1)%k;
i++;
}
return Q.base[Q.rear];
}
搞不清出错的原理,就直接把那一部分改成最简单的表达方式。