严蔚敏数据结构习题3.32
2015-10-13 20:25
525 查看
试利用循环队列编写求k阶菲波那契序列中前n+1项的算法,要求满足:而,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为k,则在算法执行结束时,留在循环队列中的元素应是所求k阶菲波那契序列中的最后k项)
注意k阶菲波那契序列,一开始有k-1个0,第k个为1,然后第k+1个数为前k个数之和,如此类推~如:
2阶斐波那契数列:0,1,1,2,3,5,8……
3阶斐波那契数列:0,0,1,2,……
注意k阶菲波那契序列,一开始有k-1个0,第k个为1,然后第k+1个数为前k个数之和,如此类推~如:
2阶斐波那契数列:0,1,1,2,3,5,8……
3阶斐波那契数列:0,0,1,2,……
#include <stdio.h> #include <stdlib.h> #define maxsize 100 typedef struct { int base[maxsize]; int head,rear; }qunue; /*初始化队列*/ init_qunue(qunue &q) { q.head=q.rear=0; return 1; } int Fib(int k,int n) { int i,sum,j; qunue q; int m; init_qunue(q); for(i=0;i<k-1;i++)q.base[i]=0; q.base[k-1]=1; for(i=k;i<=n;i++) { m=i%k;/*只取前k个数,不懂就在纸上写几个循环就明白的了*/ sum=0; for(j=0;j<k;j++) sum+=q.base[(m+j)%k];/*将前k个数相加*/ q.base[m]=sum;/*赋值到第m个,成为下次循环的第k个数*/ } return sum; } int main() { int x,k,n; printf("输入max:"); scanf("%d",&x); printf("输入费伯纳西数列阶数:"); scanf("%d",&k); for(n=1;;n++) { if(Fib(k,n)<=x&&Fib(k,n+1)>x)break; } printf("n值为:%d\n",n); return 0; }
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java数据结构和算法学习之汉诺塔示例
- Java数据结构及算法实例:三角数字
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构之AVL树详解
- qqwry.dat的数据结构图文解释第1/2页
- JavaScript中数据结构与算法(五):经典KMP算法