C++ 各种无符号整型能够在溢出之前计算出斐波那契数列的最大项数是几?答案是24、47、93
2023-09-14 09:01:28 时间
斐波那契数列 (Fibonacci)
又称黄金分割数列,因数学家列昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:
1、1、2、3、5、8、13、21、34……
在数学上,斐波那契数列以如下被以递推的方法定义:
F(1) = 1,F(2) = 1
F(n) = F(n - 1) + F(n - 2) (n ≥ 3,n ∈ N*)
简单来讲就是:数列中第3项开始,任一项的值都等于它前两项之和。
用数列定义,可以计算出各种 unsigned 无符号整数类型在溢出之前最多能输出到数列的第几项? 答案是24、47、93:
#include <iostream>
#include <limits>
using namespace std;
#define outFibonacci(nType) { int i = 1;\
while (i++)\
if (Fibonacci<nType>(i+1)==Fibonacci<nType>(i+2)){\
cout<<"F("<<i<<")\t= "<<Fibonacci<nType>(i)<<endl;\
break;\
}\
cout<< "Max Num\t= " << numeric_limits<nType>::max() << endl << endl;\
}
template<typename _T> _T Fibonacci(_T n){
_T f, f1, f2;
f = f1 = f2 = 1;
for (auto i=3; i<=n; ++i){
f = f1 + f2;
if (f<f2){ //设置溢出条件
f=-1;
break;
}
f1 = f2;
f2 = f;
}
return f;
}
int main(void)
{
outFibonacci(unsigned short);
outFibonacci(unsigned int);
outFibonacci(unsigned long); //与上一类型输出相同
outFibonacci(unsigned long long);
outFibonacci(size_t); //在我的系统上与上一类型输出相同
return 0;
}
输出结果:
F(24) = 46368
Max Num = 65535F(47) = 2971215073
Max Num = 4294967295F(47) = 2971215073
Max Num = 4294967295F(93) = 12200160415121876738
Max Num = 18446744073709551615F(93) = 12200160415121876738
Max Num = 18446744073709551615
--------------------------------
Process exited after 0.6217 seconds with return value 0
请按任意键继续. . .
注:上述代码中有一个函数 numeric_limits<TypeName>::max() 计算数据类型的最大值,需要头文件#include <limits>;numeric_limits<TypeName>::min() 则是计算数据类型的最小值。
相关文章
- C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)
- C++ code:数值计算之矩形法求解积分问题
- C++ 只用一行代码就能计算斐波那契数列!
- Open3D(C++) 计算点云的法向量
- Open3D(C++) 计算向量的夹角
- Open3D(C++) 计算三角形的有向面积
- Open3D (C++) 计算三维空间点到直线的距离
- Open3D (C++) 计算点云坐标最值及其索引
- 【华为OD机试 2023最新 】 最大报酬(C++ 100%)
- C++ std::function的用法
- C++之sleep/usleep/this_thread::yield/this_thread::sleep_for延时区别(一百四十)
- C++之读写文件操作(fread/fwrite)(七十七)
- [C++基金会]位计算 游戏开发中的应用
- c++ stl algorithm: std::find, std::find_if
- C++ std::numeric_limits用法
- 【C++提高】单个类模板语法详解
- C++基础知识要点--语句(Primer C++ 第五版 · 阅读笔记)
- 刷题笔记|计算两个年份间某一日期是周末的天数,发现ctime库对象有时间范围(C++|Python )
- vc++ 中ADO数据库的配置(SQLServer2005)