Description
试利用循环队列编写k阶斐波那契数列中前n+1项 (f(0),f(1),…,f(n))的程序,要求满足: f(n)<=max而f(n+1)>max,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为k,则在程序执行结束时,留在循环队列中的元素应是所求k阶斐波那契序列中的最后k项 f(n-k+1),…,f(n))。
Input
输入常数max(0<max<10000),阶数k(1<k<100),用空格隔开。
Output
输出k阶斐波那契数列中的最后k项f(n-k+1),…,f(n)。
-
Sample Input
14 2
-
Sample Output
8 13
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int *Date;
int front;
int rear;
int K;
} Queue;
Queue* CreateQueue(int k)
{
Queue *Q;
Q = (Queue*)malloc(sizeof(Queue));
Q->K = k + 1;
Q->Date = (int*)malloc(sizeof(int)*Q->K);
Q->front = Q->rear = 0;
return Q;
}
void AddQ(Queue *Q, int item)
{
if((Q->rear+1)%Q->K == Q->front)
{
return;
}
else{
Q->rear = (Q->rear+1)%Q->K;
Q->Date[Q->rear] = item;
}
}
int DeleteQ(Queue *Q)
{
if(Q->rear == Q->front){
printf("队列为空\n");
return 0;
}
else{
Q->front = (Q->front+1)%Q->K;
return Q->Date[Q->front];
}
}
void Fibonacci(int k,int max)
{
Queue *q;
int i, item, t = 1,j = 0;
q = CreateQueue(k);
for(i = 0; i<k; i++)
if(i == k-1)
AddQ(q,1);
else
AddQ(q,0);
while(t <= max){
j++;
DeleteQ(q);
AddQ(q,t);
t = 0;
for(i = 0; i<k; i++){
item = DeleteQ(q);
t += item;
AddQ(q,item);
}
}
for(i = 0; i<k; i++){
item = DeleteQ(q);
printf("%d ", item);
AddQ(q,item);
}
}
int main()
{
int k,max;
scanf("%d %d",&max,&k);
Fibonacci(k,max);
return 0;
}
思路:利用循环队列(令队列的长度为k)
- 输入数列的前k项,依次入队,
- 队首元素出队
- t入队(t初始值为1)
- 对队列中所有元素求和为t
- 若t<=max执行步骤2
- 输出队列中余下的元素