k阶斐波那契数列简要描述:
第0项到k-2项为0,第k-1项为1,之后每项都为前k项的和。
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int *data;
int front;
int rear;
int n;
}SeqQueue;
SeqQueue *seq;
SeqQueue* CreateQueue(int k); //创建队列
int IsEmpty(SeqQueue *q); //判空
int IsFull(SeqQueue *q); //判满
void Push(SeqQueue *q, int item); //入队
void Pull(SeqQueue *q); //出队
void Fibonacci(SeqQueue *q, int max, int k); //斐波那契数列入队
void PrintQueue(SeqQueue *q); //输出队列元素
int main()
{
int max,k;
scanf("%d%d", &max, &k);
seq = CreateQueue(k);
Fibonacci(seq, max, k);
PrintQueue(seq);
return 0;
}
SeqQueue* CreateQueue(int k)
{ //创建队列
SeqQueue *q;
q = (SeqQueue*) malloc (sizeof(SeqQueue));
q->n = k + 1;
q->data = (int*) malloc (sizeof(int) * q->n);
//注意malloc用法,不能将q->n写成k+1,否则会re
q ->front = 0;
q->rear = 0;
for(int i = 0; i < k-1; i++) {
Push(q, 0);
}
Push(q, 1);
return q;
}
int IsEmpty(SeqQueue *q)
{ //判空
if (q->front == q->rear) {
return 1;
}
else {
return 0;
}
}
int IsFull(SeqQueue *q)
{ //判满
if (q->front == (q->rear + 1) % q->n) {
return 1;
}
else {
return 0;
}
}
void Push(SeqQueue *q, int item)
{ //入队
if(IsFull(q)) {
printf("full");
return;
}
else {
q->data[q->rear] = item;
q->rear = (q->rear + 1) % q->n;
}
}
void Pull(SeqQueue *q)
{ //出队
if(IsEmpty(q)) {
printf("empty");
return;
}
q->front = (q->front + 1) % (q->n);
}
void Fibonacci(SeqQueue *q, int max, int k)
{ //k阶斐波那契数列入队
int tmp = 1;
while (tmp <= max){
Pull(q);
Push(q, tmp);
tmp = 0;
for(int i =1; i <= k; i++) {
tmp += q->data[(q->rear + q->n - i) % q->n];
}
}
}
void PrintQueue(SeqQueue *q)
{ //输出队列元素
if(IsEmpty(q)) {
return;
}
int tmp;
tmp = q->front;
while (tmp != (q->rear + q->n - 1) % q->n) {
printf("%d ", q->data[tmp]);
tmp = (tmp + 1) % q->n;
}
printf("%d ", q->data[tmp]);
}