已知K阶斐波那契序列定义为:f0=0,f1=0,……fk-2=0,fk-1=1;
fn=fn-1+fn-2+……+fn-k, n=k,k+1,……
试编写程序求K阶斐波那契数列第m项的值。k和m均以值调用的方式在函数参数表中出现。
#include <stdio.h>
#include <conio.h>
#define OK 1
#define ERROR 0
#define N 40
typedef int status;
status K_Rank_Fib(int k,int m,long *p) /* 求K阶斐波那契数列第m项的值,以指针p返回 */
{ int i,j;long temp_array[N]; /* i,j控制循环,数组存放Fibonacci序列各项的值*/
if(k<2||m<0||m>=N) return ERROR;
if(m<k-1) *p=0;
else if(m==k-1) *p=1;
else
{
for (i=0;i<k-1;i++)
temp_array[i]=0;
temp_array[i]=1;
for (i=k;i<=m;i++) /*关键所在:k阶斐波那契序列第n项=第n-1项的2倍-第n-k-1项,这样不必每次都累加,具体请参考代码 */
{ temp_array[i]=0;
if (i==k)
{ for (j=1;j<=k;j++)
temp_array[i]+=temp_array[i-j];
}
else temp_array[i]=temp_array[i-1]*2-temp_array[i-(k+1)];
}
*p=temp_array[i-1];
}
return OK;
}
int main(void)
{ int i;
int k,m;long array[1];long *p=array;
scanf("%d%d",&k,&m);
if (K_Rank_Fib(k,m,p)) printf("%ld/n",array[0]);
else printf("Something Wrong/t");
puts("Press anykey to quit");
getch();
return 0;
}
PS:1.本人初学,不求其他只愿代码能够尽量简洁高效,欢迎各位多多批评、多多挑毛病^_^。加我QQ 505011298。