题目大意
感谢https://blog.csdn.net/LanXiu_/article/details/107118571
思路
这个题目很巧妙,说实话也开了眼界。
(虽然明明可以用数组,而且数组有更快的算法)
首先是初始化的问题。k阶不一定是二阶,所以在一个容量为k的循环队列(实际上要开容量到k+1,以便判队列满,不过这不重要,因为可以不判 )中,我们先压进去k-1个0,再压进去一个1,这就完成了初始化。
然后就是循环,细节也很多,看代码吧。
代码
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int maxi,k;
typedef struct node
{
int *data;
int len,rear,front;
int n;
}*Queue,Qnode;
Queue Createqueue(int num)
{
Queue q=(Queue)malloc(sizeof(Qnode));
num++;///多申请一个空间 判断有没有满
q->data=(int *)malloc(sizeof(int)*num);
q->front=q->rear=0;
q->len=0;
q->n=num;
return q;
}
int Isfull(Queue q)
{
return (q->rear+1)==q->front;
}
int Isempty(Queue q)
{
return q->rear==q->front;
}
void push(Queue q,int x)
{
q->data[q->rear]=x;
q->len++;
q->rear=(q->rear+1)%q->n;
}
int pop(Queue q)
{
int temp=q->data[q->front];
q->front=(q->front+1)%q->n;
q->len--;
return temp;
}
int getfront(Queue q)
{
return q->data[q->front];
}
void Destroy_Queue(Queue q)
{
free(q->data);
free(q);
}
void Fibonacci(Queue q,int k,int maxi)
{//斐波那契数列的循环数列
int i,t=1,num;
for(i=1;i<=k;i++)
{
if(i!=k) push(q,0);
else push(q,1);
}
while(t<=maxi)
{
pop(q);///先删
push(q,t);///t要初始化为1,这个地方就推进去了,比较巧妙
t=0;
for(i=1;i<=k;i++)
{
num=pop(q);
t+=num;
push(q,num);
}
}
for(i=1;i<=k;i++)
{
num=pop(q);
printf("%d ",num);
}
}
int main()
{
scanf("%d%d",&maxi,&k);
Queue q=Createqueue(k);
Fibonacci(q,k,maxi);
Destroy_Queue(q);
}