代码:
注意k阶斐波那契序列定义:第k和k+1项为1,前k - 1项为0,从k项之后每一项都是前k项的和
例如:k=2时,斐波那契序列为:0,1,1,2,3,5,8,13...
k=3时,斐波那契序列为:0,0,1,1,2,4,7,13,24...
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue
{
int data[100];//数据
int front;//头指示器
int rear;//尾指示器
} SeqQueue;
void Initqueue(SeqQueue*Q);//初始化循环队列
void Compute(int max,int k,SeqQueue*Q);//计算斐波那契数列
void Printfqueue(SeqQueue*Q,int k);//输出最后k项
int main()
{
SeqQueue queue;
int Max,K;
Initqueue(&queue);//初始化循环队列
scanf("%d %d",&Max,&K);//输入约定的常数与阶数
Compute(Max,K,&queue);//计算斐波那契数列
Printfqueue(&queue,K);//输出最后k项
return 0;
}
/*初始化循环队列
*Q:被初始化的队
*/
void Initqueue(SeqQueue*Q)
{
Q->front=Q->rear=0;
}
/*计算斐波那契数列 f(0)到f(n);
*max: f(n)<=max,f(n+1)>max
*k: 要求输出的最后 k 项
*Q:目标循环队列
*/
void Compute(int max,int k,SeqQueue*Q)
{
int sum1=0,sum2=1;//此时sum1是前k-1个数的和,sum2是前k个数和
Q->rear=k-1;
for(int i=0; i<k-1; i++)
{
Q->data[i]=0;//前k-1个数置为0
}
Q->data[k-1]=1;//第k个数为1
while(!(sum2>max&&sum1<=max))//sum1是f(n),sum2是f(n+1)
{
int t=Q->data[Q->front],m,n;
sum1=sum2;//下一个sum1等于sum2
n=Q->rear=(Q->rear+1)%k;//形成只有k个数据的循环队列
Q->data[Q->rear]=sum1;//入栈的是前k个数之和
sum2=sum2-t+sum1;//下一个sum2 = 原来的sum2 - 队头:t + 新增的队尾:sum1
m=Q->front=(Q->front+1)%k;//队头后移
}
}
/*输出最后k项
*Q:目标队列
*k:要求的项数
*/
void Printfqueue(SeqQueue*Q,int k)
{
for(int i=Q->front; i!=Q->rear; i++)
{
i=i%k;
printf("%d ",Q->data[i]);
}
printf("%d",Q->data[Q->rear]);//特殊处理
}