每日一小练——高速Fibonacci数算法
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练!
题目:高速Fibonacci数算法
内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律:
尝试寻找高速的求出fn的方法
我的解法:上来没多想,打开vs2013就敲了起来,问题果然非常easy,分分钟就超神。。奥,不正确就攻克了!
事实上题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,只是由于求解高速方法在递归之前,我编写了一个非递归的算法
#include <iostream>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{int f(int n);cout << f(7) << endl;getchar();return 0;
}int f(int n)
{int temp = 0, f1 = 1, f2 = 1;if (n == 1 || n == 2)return 1;else{for (int i = 1; i < (n - 1); i++){temp = f1 + f2;f2 = f1;f1 = temp;}return temp;}
}
然后我又编写了递归的算法
#include <iostream>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{int f(int n);cout << f(7) << endl;getchar();return 0;
}int f(int n)
{if (n == 1|| n==2)return 1;if (n > 2)return f(n - 1) + f(n - 2);
}
在递归的基础上,有人提出了更犀利的算法,这个我没有想到。。羞愧。。。
这个算法利用了一些技巧矩阵,通过矩阵乘法来算Fibonacci的加法,然后通过我在《数值自乘非递归解》中提到的利用区分奇偶数来利用指数二进制堆乘的方法,降低乘法的次数。
ps:
利用上面的矩阵连乘,在矩阵11位置的数就是矩阵11和21的和,而且用矩阵11和21表示Fibonacci的f(n-1)和f(n-2),通过连乘来求fn。
#include <iostream>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{int f(int n);cout << f(7) << endl;getchar();return 0;
}int f(int n)
{void matrix_power(int a, int b, int c, int d, int n, int *aa, int *bb, int *cc, int *dd);int a, b, c, d;if (n == 1 || n == 2){return 1;}else{matrix_power(1, 1, 1, 0, n - 2, &a, &b, &c, &d);return a + b;}
}void matrix_power(int a, int b, int c, int d, int n, int *aa, int *bb, int *cc, int *dd)
{int xa, xb, xc, xd;if (n == 1)*aa = a, *bb = b, *cc = c, *dd = d;else if (n & 0x01 == 1){matrix_power(a, b, c, d, n - 1, &xa, &xb, &xc, &xd);*aa = a*xa + b*xc;*bb = a*xb + b*xd;*cc = c*xa + d*xc;*dd = c*xb + d*xd;}else{matrix_power(a, b, c, d, n >> 1, &xa, &xb, &xc, &xd);*aa = xa*xa + xb*xc;*bb = xa*xb + xb*xd;*cc = xc*xa + xd*xc;*dd = xc*xb + xd*xd;}
}
三段代码的实验结果同例如以下:
欢迎大家增加每日一小练,嘿嘿!
每天练一练,日久见功夫,加油!
-End-
參考文献:《c语言名题精选百则》
每日一小练——高速Fibonacci数算法相关推荐
- 每日一小练——求质数
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:求质数 内容: 试编写一个程序,找出前N个质数.如果没有进一步要求,这不是难题.但在此希望从所知的.使用除法的方法中,用最 ...
- 每日一小练——支配值数目
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:支配值数目 内容:已知f[]和g[]两个整数数组,元素都已经从小到大排列,试编写程序算出f[]中每一个元素比g[]中每一个 ...
- 每日一小练——按字典顺序列出全部子集
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出全部子集 内容: 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的全部子集找出来. 解答: ...
- 每日一小练(「各位数字之积」与「各位数字之和」的差)
题目描述:输入一个整数 n,请计算并返回该整数「各位数字之积」与「各位数字之和」的差 例如: 输入:234 返回:15 解释:各位数之积 = 2 * 3 * 4 = 24 各位数之和 = 2 + 3 ...
- 数据结构与算法——每日一练(4月)
文章目录 每日一练 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.16 4.17 4.18 4.19 4.20 ...
- 数据结构与算法——每日一练(12月)
文章目录 每日一练 12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9 12.10 12.11 12.12 12.13 12.14 12.15 12.16 12. ...
- Python每日一练第5天——将一组数尽可能均匀地分成两堆,使两个堆中的数的和尽可能相等
每日一练-做题 麦克叔叔去世了,他在遗嘱中给他的两个孙子阿贝和鲍勃留下了一堆珍贵的口袋妖怪卡片.遗嘱中唯一的方向是"尽可能均匀地分配纸牌的价值".作为Mike遗嘱的执行人,你已经为 ...
- C语言每日一练——第79天:高次方数的尾数
C语言每日一练 2022年1月27日 文章目录 题目描述 问题分析 代码实现 运行结果 题目描述 求13的13次方的最后三位数 问题分析 根据乘法竖式计算我们可以发现,要得到乘法结果的后三位,只需要用 ...
- python求完数的因子_「每日一练」巧用python找出1000以内的所有完数
原标题:「每日一练」巧用python找出1000以内的所有完数 "完数"指的是一个数恰巧等于它的所有因子之和,比如说6,它的因子分别是1,2,3,而6正好等于1+2+3,所以6就是 ...
最新文章
- 2021年大数据Spark(五):大环境搭建本地模式 Local
- C++ 汇编代码查看
- MIT人工突触芯片新突破:指甲大小的芯片有望媲美超算
- JFinal 源码导读第二天(2)configPlugin,configRoute
- Django自带的加密算法及加密模块
- 【OpenStack】OpenStack系列1之OpenStack本地开发环境搭建向社区贡献代码
- libusb usb设备访问接口库
- 【AI视野·今日CV 计算机视觉论文速览 第227期】Fri, 25 Jun 2021
- mysql 查看数据库字段是否存在,mysql查询某张表是否存在某个字段和判断是否存在某个表名...
- 因代码不规范,码农枪击4名同事,一人情况危急
- Architecture(5)电商APP组件化探索
- [原创]markdown语法学习(commonmark)
- JSON.parse与eval
- Ubuntu上CUDNN下载及安装过程详细介绍
- 编码表(ASCII码GB2312gbkunicodeUTF-8)
- 韩媒批其国民都沉迷“美色” 娱乐产业是起因
- H2O技术方案预研分析
- 速码工具箱,Excel批量生成二维码,瞬间搞定!
- 程序运行时的内存空间分布
- source music play list 11-26 (edit 12-6 by clin003 )