K阶斐波那契数列(NOJ理论第10题)(非精解)
前言
这篇文章主要是为了诠释什么叫“k阶斐波那契数列”,以免各位做的时候意味题错了,同时还能水一篇文章。
k阶斐波那契数列一开始前k-1项都是0,第k项为1,后面生成的每一项都是前数列之前k项的和。
答案
#include <iostream>
static int MAXSIZE;
typedef struct CircularQueue
{
int series[500];
int rear;
int front;
} CircularQueue;
void init(CircularQueue *aQueue)
{
aQueue->rear = aQueue->front = 0;
}
int isEmpty(CircularQueue *aQueue)
{
return aQueue->front == aQueue->rear;
}
int isFull(CircularQueue *aQueue)
{
return (aQueue->rear + 1) % MAXSIZE == aQueue->front;
}
int pop(CircularQueue *aQueue)
{
int rtn = aQueue->series[aQueue->front];
aQueue->front = (aQueue->front + 1) % MAXSIZE;
return rtn;
}
void push(CircularQueue *aQueue, int element)
{
if (!isFull(aQueue))
{
aQueue->series[aQueue->rear] = element;
aQueue->rear = (aQueue->rear + 1) % MAXSIZE;
}
else
{
pop(aQueue);
aQueue->series[aQueue->rear] = element;
aQueue->rear = (aQueue->rear + 1) % MAXSIZE;
}
}
void initF(int *F, int k)
{
for (int i = 0; i < k - 1; i++)
{
F[i] = 0;
}
F[k - 1] = 1;
}
void pushF(CircularQueue* aQueue, int* F, int k)
{
for (int i = 0; i < k; i++)
{
push(aQueue, F[i]);
}
}
void caculate(int* F, int k)
{
int newData = 0;
for (int i = 0; i < k; i++)
{
newData += F[i];
}
for (int i = 0; i < k - 1; i++)
{
F[i] = F[i + 1];
}
F[k - 1] = newData;
}
int main()
{
int k, max;
scanf("%d%d", &max, &k);
MAXSIZE = k + 1;
CircularQueue *aQueue = (CircularQueue *)malloc(sizeof(CircularQueue));
init(aQueue);
int Fibonacci[k];
initF(Fibonacci, k);
pushF(aQueue, Fibonacci, k);
while (1)
{
caculate(Fibonacci, k);
if (Fibonacci[k - 1] <= max)
{
push(aQueue, Fibonacci[k-1]);
}
else
{
break;
}
}
if (k != 1)
{
while (!isEmpty(aQueue))
{
printf("%d ", pop(aQueue));
}
}
else{
printf("1");
}
return 0;
}
(还就那个淼)

浙公网安备 33010602011771号