C++中的斐波那契数列不能超过47个数
Posted
技术标签:
【中文标题】C++中的斐波那契数列不能超过47个数【英文标题】:Fibonacci series in C++ can't get more than 47 numbers 【发布时间】:2022-01-12 14:14:04 【问题描述】:我设计的这个程序可以打印斐波那契数列 (series[i] = series[i-1] + series[i-2]
) 但我不能得到超过 47 个数字,因为第 48 个数字变成负数和奇怪的数字(我认为当列表超出范围或该项目为空):
#include <iostream>
#include <vector>
using namespace std;
int main ()
int length;
string again = "";
do
cout << "Enter the length you want in your sequence: ";
cin >> length;
vector<int> series(length);
for (int n=0; n<=1; n++) series[n] = n;
for (int number=2; number<=length; number++)
series[number] = series[number-1] + series[number-2];
for (int i=0; i<length; i++) cout << series[i] << " ";
cout << endl << "Do it again ? <y/n> ";
cin >> again;
cout << endl;
while (again == "y");
编辑:
“改进”代码:
#include <iostream>
#include <vector>
#include <string>
std::vector<int> fibonacci (int length)
std::vector<int> series(length);
series[0] = 0;
series[1] = 1;
for (int num=2; num<length; num++)
series[num] = series[num-1] + series[num-2];
return series;
int main ()
std::string again;
do
std::cout << "Enter how many numbers you want in your series: ";
int length;
std::cin >> length;
std::vector<int> series(length);
series = fibonacci(length);
for (int n=0; n<length; n++) std::cout << series[n] << " ";
std::cout << "\nDo it again <y/n> ? ";
std::cin >> again;
std::cout << std::endl;
while (again == "y");
【问题讨论】:
将“int”更改为“long unsigned int”以允许 64 位斐波那契结果而不是 32 位。int
对于结果来说太小了。使用long
甚至更好的long long
如果你想走得更远,你可以考虑牺牲一些精度并使用double
。在这种情况下,您还可以对斐波那契数列使用 O(1) 公式。
您达到了 32 位 int 数据类型的限制。无论如何,限制都会存在,即使是 long long
数据类型;对length
施加限制,验证输入,如果太大则失败。
你不是在最后一次迭代中离开了向量的末端吗?您的索引从 0
到 length
包含在内,因此您将 length+1
值存储在向量中。
【参考方案1】:
当您到达第 47 个值时,数字超出了int
范围。 int
的最大值是 2,147,483,647
,第 46 个数字正好在 1,836,311,903
下方。第 47 个数字超过了2,971,215,073
的最大值。
此外,正如 LeonardBlunderbuss 所提到的,您使用 for
循环超出了向量的范围。向量以0
开头,因此通过number<=length;
将调用range+1
元素。范围仅上升到length-1
。
【讨论】:
【参考方案2】:您遇到整数溢出,这意味着您正在尝试计算一个超出INT_MAX
和INT_MIN
边界的数字。在无符号数的情况下,它只会溢出到零并重新开始,而在有符号整数的情况下,它会翻转到INT_MIN
。在这两种情况下,这都称为整数溢出或整数回绕。
对于原始数据类型,您可以使用 long long int
(在大多数现代系统上可能是 64 位)而不是 int
来为解决方案添加创可贴,或者您可以使用更好的方法,例如库支持(几乎)任意长的数据类型,例如libBigInteger
。
参考文献
-
整数溢出,于 2014 年 3 月 4 日访问,
<http://en.wikipedia.org/wiki/Integer_overflow>
C++ 大整数库,于 2014 年 3 月 4 日访问,<https://mattmccutchen.net/bigint/>
limits.h 头文件,于 2014 年 3 月 4 日访问,<http://tigcc.ticalc.org/doc/limits.html>
【讨论】:
【参考方案3】:这是我计算大斐波那契数的解决方案
// Study for algorithm that counts n:th fibonacci number
#include <iostream>
#include <cstdlib>
#include "boost/multiprecision/cpp_int.hpp"
#define get_buffer(a) buffer[(a)%2]
#define BIG boost::multiprecision::cpp_int
int main(int argc, const char* argv[])
// atoi returns 0 if not integer
if(argc != 2 || atoi(argv[1]) < 1)
std::cout << "You must provide one argument. Integer > 0" << std::endl;
return EXIT_SUCCESS;
// ring buffer to store previous two fibonacci number, index it with [i%2]
// use defined function get_buffer(i), it will do the magic for you
BIG buffer[2]= 1, 1 ;
// n:th Fibonacci
unsigned int fn = atoi(argv[1]);
// count loop is used if seeked fibonacci number is gt 2
if(fn > 2)
for(unsigned int i = 2; i < fn; ++i)
get_buffer(i) = get_buffer(i-1) + get_buffer(i-2);
// get_buffer(i-1) + get_buffer(i-2) == buffer[0] + buffer[1]
// if you want to print out every result, do it here
// Result will be send to cout
std::cout << "Fibonacci[" << fn << "] is " << get_buffer(fn-1) << std::endl;
return EXIT_SUCCESS;
【讨论】:
以上是关于C++中的斐波那契数列不能超过47个数的主要内容,如果未能解决你的问题,请参考以下文章