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 施加限制,验证输入,如果太大则失败。 你不是在最后一次迭代中离开了向量的末端吗?您的索引从 0length 包含在内,因此您将 length+1 值存储在向量中。 【参考方案1】:

当您到达第 47 个值时,数字超出了int 范围。 int 的最大值是 2,147,483,647,第 46 个数字正好在 1,836,311,903 下方。第 47 个数字超过了2,971,215,073 的最大值。

此外,正如 LeonardBlunderbuss 所提到的,您使用 for 循环超出了向量的范围。向量以0 开头,因此通过number&lt;=length; 将调用range+1 元素。范围仅上升到length-1

【讨论】:

【参考方案2】:

您遇到整数溢出,这意味着您正在尝试计算一个超出INT_MAXINT_MIN 边界的数字。在无符号数的情况下,它只会溢出到零并重新开始,而在有符号整数的情况下,它会翻转到INT_MIN。在这两种情况下,这都称为整数溢出或整数回绕。

对于原始数据类型,您可以使用 long long int(在大多数现代系统上可能是 64 位)而不是 int 来为解决方案添加创可贴,或者您可以使用更好的方法,例如库支持(几乎)任意长的数据类型,例如libBigInteger

参考文献

    整数溢出,于 2014 年 3 月 4 日访问,&lt;http://en.wikipedia.org/wiki/Integer_overflow&gt; C++ 大整数库,于 2014 年 3 月 4 日访问,&lt;https://mattmccutchen.net/bigint/&gt; limits.h 头文件,于 2014 年 3 月 4 日访问,&lt;http://tigcc.ticalc.org/doc/limits.html&gt;

【讨论】:

【参考方案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个数的主要内容,如果未能解决你的问题,请参考以下文章

递归优化的斐波那契数列

介绍下斐波那契数列。

裴波那契数列是怎样的数列?有啥特别的地方

Go斐波那契数列

用JAVA表示斐波那契数列 急急急!!!!

斐波那契数列是啥?有啥性质?有没有与之相似的数列?