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;
}

K阶斐波那契数列--------西工大NOJ习题.10的更多相关文章

  1. k阶斐波那契数列fibonacci第n项求值

    已知K阶斐波那契数列定义为:f0 = 0,  f1 = 0, … , fk-2 = 0, fk-1 = 1;fn = fn-1 + fn-2 + … + fn-k , n = k , k + 1, … ...

  2. 【严蔚敏】【数据结构题集(C语言版)】1.17 求k阶斐波那契序列的第m项值的函数算法

    已知k阶斐波那契序列的定义为 f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1; f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,... 试编写求k阶斐 ...

  3. 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造

    一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...

  4. 关于k阶裴波那契序列的两种解法

    在学校的anyview的时候,遇到了这个题: [题目]已知k阶裴波那契序列的定义为f(0)=0, f(1)=0, ..., f(k-2)=0, f(k-1)=1;f(n)=f(n-1)+f(n-2)+ ...

  5. 九度OJ 1205:N阶楼梯上楼问题 (斐波那契数列)

    时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3739 解决:1470 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括一个整 ...

  6. 2018年东北农业大学春季校赛 K wyh的数列【数论/斐波那契数列大数取模/循环节】

    链接:https://www.nowcoder.com/acm/contest/93/K来源:牛客网 题目描述 wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F( ...

  7. 斐波那契数列—Java

    斐波那契数列想必大家都知道吧,如果不知道的话,我就再啰嗦一遍, 斐波那契数列为:1 2 3 5 8 13 ...,也就是除了第一项和第二项为1以外,对于第N项,有f(N)=f(N-1)+f(N-2). ...

  8. Luogu P1962 斐波那契数列(矩阵乘法模板)

    传送门(其实就是求斐波那契数列....) 累了 明天再解释 做这道题需要一些关于矩阵乘法的基础知识. 1. 矩阵乘法的基础运算 只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于 ...

  9. 斐波那契数列(递归)&求100以内的素数

    Java 5 添加了 java.util.Scanner 类,这是一个用于扫描输入文本的新的实用程序.它是以 前的 StringTokenizer 和 Matcher 类之间的某种结合.由于任何数据都 ...

随机推荐

  1. CentOS 下 MySQL 8.0 安装部署,超详细!

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Mysql8.0安装 (YUM方式) 首先删除系统默认或 ...

  2. NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)

    ​  前言  本文介绍了NMS的应用场合.基本原理.多类别NMS方法和实践代码.NMS的缺陷和改进思路.介绍了改进NMS的几种常用方法.提供了其它不常用的方法的链接. 本文很早以前发过,有个读者评论说 ...

  3. Erdos-Renyi随机图的生成方式及其特性

    1 随机图生成简介 1.1 \(G_{np}\)和\(G_{nm}\) 以下是我学习<CS224W:Machine Learning With Graphs>[1]中随机图生成部分的笔记, ...

  4. 0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题

    先看图 这个是JavaScript语言自身存在的一个问题.说道这里不得不提一下网上流传的JavaScript搞笑图 我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失 ...

  5. JS 异步与 Promise

    JS 异步与 Promise 本文写于 2020 年 6 月 8 日 1. 同步与异步与回调函数 Promise 现在是前端面试必考题呀,但是先不急着看 Promise,我们首先来看看什么是异步. - ...

  6. URL 是什么?

    URL 是什么? 本文写于 2020 年 5 月 16 日 URL 是什么?天天听到人家说到这个名词,那它到底是什么? URL 是统一资源定位符,Uniform Resource Locator. 俗 ...

  7. 一文学会Java的交互式编程环境jshell

    什么是交互式编程环境?重点词交互,在这样的编程环境中,你每输入一行代码,环境都会给你一个反馈,这就是交互式的编程环境.这种编程环境并不太适合工程化的复杂性需求,但在一些快速验证.简单计算之类的场景下还 ...

  8. 课堂练习——neo4j简单使用

    启动neo4j: neo4j.bat console 进入neo4j数据库的conf目录下,编辑neo4j.conf文件:将当前数据库设置为你要建立的数据库名称(数据库不能重名): dbms.acti ...

  9. cpulimit-限制CPU速率

    CPULimit是一个简单的程序,它可以限制指定进程的CPU百分比. 1.安装依赖 root@localhost:~# apt-get -y install git 2.从GitHUB中克隆源码到本地 ...

  10. KMP算法(改进的模式匹配算法)——next函数

    KMP算法简介 KMP算法是在基础的模式匹配算法的基础上进行改进得到的算法,改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的部分匹配结果将模式串向 ...