求K阶Fibonacci数列第m项的值

已知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。

   2.文章全部为原创,过程中可能有些文章参考了某些文章的思路,但本人宗旨和目标只是:a.不如我之人可以向我学习b.希望高手可以对我指点一二,以求做到最好;c.资源共享;别无其他。
   3.TC2.0下通过。当然,解法很多,如果哪位找到更好方法的话,如若可以分享我将很荣幸。
1.两个串相等的充要条件是( )。A.串长度相等B.串长度任意 C.串中各位置字符任意 D.串中各位置字符均对应相等 2.对称矩阵的压缩存储:以行序为主序存储下三角中的元素,包括对角线上的元素。二维下标为( i, j ),存储空间的一维下标为k,给出k与 i, j (i<j)的关系k=( ) (1<= i, j <= n , 0<= k < n*(n+1)/2)。 A.i*(i-1)/2+j-1 B.i*(i+1)/2+j C.j*(j-1)/2+i-1 D.j*(j+1)/2+i 3.二维数组A[7][8]以列序为主序的存储,计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A.38 B.43 C.26 D.29 4.已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。A.108 B.180 C.176 D.112 5. 下面( )不属于特殊矩阵。 A.对角矩阵 B. 三角矩阵C. 稀疏矩阵 D. 对称矩阵 6. 假设二维数组M[1..3, 1..3]无论采用行优先还是列优先存储,其基地址相同,那么在两种存储方式下有相同地址的元素有( )个。 A. 3 B. 2 C. 1 D. 0 7. 若Tail(L)非空,Tail(Tail(L))为空,则非空广义表L的长度是( )。(其中Tail表示取非空广义表的表尾) A. 3 B. 2 C. 1 D. 0 8.串的长度是( )。 A.串中不同字母的个数 B.串中不同字符的个数C.串中所含字符的个数,且大于0 D.串中所含字符的个数 9.已知广义表(( ),(a), (b, c, (d), ((d, f)))),则以下说法正确的是( )。A.表长为3,表头为空表,表尾为((a), (b, c, (d), ((d, f))))B.表长为3,表头为空表,表尾为(b, c, (d), ((d, f)))C.表长为4,表头为空表,表尾为((d, f)) D.表长为3,表头为(()),表尾为((a), (b, c, (d), ((d, f))))10.广义表A=(a,b,c,(d,(e,f))),则Head(Tail(Tail(Tail(A))))的为( )。(Head与Tail分别是取表头和表尾的函数) A.(d,(e,f)) B.d C.f D.(e,f)二、填空题(每空 2 分,共 8 分)。 1.一个广义表为 F = (a, (a, b), d, e, (i, j), k),则该广义表的长度为________________。GetHead(GetTail(F))= _______________。 2.一个n*n的对称矩阵,如果以行或列为主序压缩存放入内存,则需要 个存储单元。 3.有稀疏矩阵如下: 0 0 5 7 0 0 -3 0 0 0 4 0 0 2 0 它的三元组存储形式为: 。 三、综合题(共 22 分)。 1.(共8分)稀疏矩阵如下图所示,描述其三元组的存储表示,以及转置后的三元组表示。 0 -3 0 0 0 4 0 6 0 0 0 0 0 0 7 0 15 0 8 0 转置前(4分): 转置后(4分): 2. (共14分)稀疏矩阵M的三元组表如下,请填M的转置矩阵T的三元组表,并按要完成算法。 (1)出M矩阵转置后的三元组存储(6分): M的三元组表: T的三元组表: i j e 2 1 3 3 2 4 4 2 5 4 3 5 5 1 6 5 3 6 i j e (2)如下提供了矩阵采用三元组存储时查找指定行号(m)和列号(n)元素的算法框架,将代码补充完整(每空2分,共8分)。 typedefstruct{ inti,j; ElemType e; }Triple; typedefstruct{ Triple data[MAXSIZE+1]; //data[0]未用 intmu,nu,tu; //矩阵的行数,列数和非零元的个数 }TSMatrix; voidFind_TSMatrix(TSMatrix M, int m, int n, ElemType&e) //M为要查找的稀疏矩阵三元组存储,m为要查找的元素的行号,n为列号,e为查找后得到的。 { for ( i=1 ; i<=M.tu ;i++) if( && ) { e=M.data[i].e; ; } if( ) e=0; }
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值