K阶斐波那契数列--------西工大NOJ习题.10

原创不易,转载请说明出处!!!

科普:k阶斐波那契数列的0到n-1项需要有初始值。

其中,0到n-2项初始化为0,第n-1项初始化为1.

在这道题目中,所引用的函数详见:数据结构实现——循环队列

(我的一篇博文)

我使用的方法是尺取法,这样可以大大地减小时间复杂度。

具体见代码:

#include <stdio.h>
#include <stdlib.h>
typedef int Elem;
typedef struct Queue
{
Elem *data;
int head;
int tail;
int size;//仅仅是一个功能,程序的判空,判断满并不依赖。
int MAX_SIZE;//是真正申请的最大值,实际存放MAX_SIZE-1个。
}Queue;
//函数原形声明
Queue *Creat(int max);
int Size(Queue* Q);
Elem GetTail(Queue *Q);
Elem GetHead(Queue *Q);
int Pop(Queue *Q);
int Push(Queue *Q, Elem e);
int Full(Queue* Q);
int Empty(Queue *Q);
int Destroy(Queue* Q); Queue *Creat(int max)
{
if(max <= 0)
return NULL;
Elem *D = (Elem*)calloc(max + 1, sizeof(Elem));
if(!D)
return NULL;
Queue *Q = (Queue*)malloc(sizeof(Queue));
if(!Q)
{
free(D);
return NULL;
}
Q->MAX_SIZE = max + 1;
Q->data = D;
Q->head = 0;
Q->tail = 0;
Q->size = 0;
return Q;
} int Destroy(Queue* Q)
{
if(!Q)
return 0;
free(Q->data);
free(Q);
return 1;
}
int Empty(Queue *Q)
{
if(Q->head == Q->tail)
return 1;
else
return 0;
}
int Full(Queue* Q)
{
if((Q->tail+1)%Q->MAX_SIZE == Q->head)
return 1;
else
return 0;
} int Push(Queue *Q, Elem e)
{
if(Full(Q))
return 0;
Q->data[Q->tail] = e;
Q->tail = (Q->tail + 1)%Q->MAX_SIZE;
Q->size += 1;
return 1;
} int Pop(Queue *Q)
{
if(Empty(Q))
return 0;
Q->head = (Q->head + 1) % Q->MAX_SIZE;
Q->size -= 1;
return 1;
} Elem GetHead(Queue *Q)
{
if(Empty(Q))
{
*(int *)NULL;//专门让程序crash
}
return Q->data[Q->head];
}
Elem GetTail(Queue *Q)
{
if(Empty(Q))
{
*(int *)NULL;//专门让程序crash
}
int t;
t = Q->tail;
t -= 1;
if(t >= 0)
return Q->data[t];
else
{
return Q->data[Q->MAX_SIZE-1];
}
}
int Size(Queue* Q)
{
return Q->size;
} int main()
{
int max, n;
scanf("%d%d",&max, &n);
int sum = 0;//使用尺取法
Queue* Q = Creat(n);//指定大小为n.
for(int i = 1; i <= n; i++)//先在队列中塞下前n项
{
if(i < n)
Push(Q,0);
else
Push(Q,1);
}
sum = 1;//初始化n项的和
while(sum<=max)//当要增加的小于等于最大值时,继续算.
{
int tmp = sum;//前一时刻的sum和
sum -= GetHead(Q);
Pop(Q);
sum += tmp;//更新sum,为下一次做准备
Push(Q,tmp);
}
for(int i = 1; i <= n; i++)//依次输出
{
printf("%d ",GetHead(Q));
Pop(Q);
}
Destroy(Q);//销毁循环队列.
return 0;
}

最新文章

  1. 数据库开发基础-SQl Server 存储过程
  2. Opencv Cookbook阅读笔记(四):用直方图统计像素
  3. 多配置文件部署mysql单机多实例
  4. ClassRequestHandler or VendorRequestHandler wIndex must be less than NumIFs
  5. JodaTime用法简介
  6. 剑指offer 整数中1 出现的次数
  7. Html5 touch event
  8. 总结一下最近用过的phpcms语法
  9. Linux学习之CentOS(十六)-----内存置换空间(swap)之建置(转)
  10. 一套代码小程序&amp;Web&amp;Native运行的探索01
  11. PDF转图片工具
  12. 设计模式系列之策略模式(Strategy Pattern)
  13. 简述移动端开发前端和app间的关系
  14. MySQL 聚合函数 控制流程函数
  15. linux百万并发之 tcp_mem
  16. protobuff 编译注意事项
  17. python爬虫之pyquery学习
  18. P1823 [COI2007] Patrik 音乐会的等待 单调栈 洛谷luogu
  19. 洛咕 P4474 王者之剑
  20. Quartz.NET教程:(01) 使用Quartz

热门文章

  1. kvm 虚拟化技术 1.2 之配置网络桥接
  2. Linux Troubleshooting 超实用系列 - Disk Analysis
  3. vmware 虚拟机系统双屏或更多屏
  4. linux篇-centos7安装samba服务器
  5. 【leetcode】239. 滑动窗口最大值
  6. DOM标签操作与事件与jQuery查找标签
  7. Python汉诺塔求解
  8. 第一次的ssm整合
  9. lanedet项目调试记录
  10. VTK 在WINDOWS上的安装使用