将大斐波那契数的最后一位编程为第n个斐波那契数。 C ++

时间:2020-06-11 12:01:37

标签: c++ algorithm fibonacci digits function-definition

我正在尝试使用C ++解决斐波那契,但是当输出位数限制与大数相交时,我的代码显示负数。

 #include<stdio.h>
 #include<iostream>
 using namespace std;

int64_t get_fibonacci_last_digit_naive(int n)
    {
    int64_t a = 0, c, i;
    int64_t b = 1;



    if (n == 0)
       return (a);
     for (i = 2; i <= n; i++)
      {
         c = a + b;
         a = b;
         b = c;


      }
      return (b);
      }

   int main()
     {
    int n;

     cin >> n;

     cout << get_fibonacci_last_digit_naive(n) << '\n';

     return 0;
    }

所以当我的输入为239时,我的输出就会显示

    239
    -1716907696316940191

    Process returned 0 (0x0)   execution time : 12.395 s
    Press any key to continue.

现在如何在C ++中存储无上限的数字?我非常菜鸟,以为我什么都不知道,这让我很不高兴。因此,我可以在C ++中打印30位以上的数字吗?

2 个答案:

答案 0 :(得分:1)

对于初学者来说,请注意该标题

#include<stdio.h>

是多余的。程序中未使用标头中的任何声明。 在C ++中,您至少应指定

#include <cstdio> 

如果需要标题中的声明。

要获得像239-th这样的大斐波那契数,您需要使用一个特殊的库来提供处理大数的服务,或者您必须自己编写此类服务,例如使用标准类{{ 1}}。

但是,要获得斐波那契数字的最后一位,则无需计算整个斐波那契数字。仅跟踪最后一位就足够了。

这是我的幼稚方法。:)

std::string

程序输出为

#include <iostream>
#include <functional>

unsigned int get_fibonacci_last_digit_my_naive( unsigned int n )
{
    const unsigned int Base = 10;

    unsigned int a[] = { 0, 1 };

    while (n--)
    {
        a[1] += std::exchange( a[0], a[1] );
        a[1] %= Base;
    }

    return a[0];
}

int main() 
{
    unsigned int n = 0;

    std::cin >> n;

    std::cout << "The last digit of the " << n << "-th fibonacci number is "
              << get_fibonacci_last_digit_my_naive( n ) << '\n';

    return 0;
}

或者是否要通过以下方式更改功能主体

The last digit of the 239-th fibonacci number is 1

并输入数字int main() { unsigned int n = 0; std::cin >> n; for ( unsigned int i = n; i < n + 10; i++ ) { std::cout << "The last digit of the " << i << "-th fibonacci number is " << get_fibonacci_last_digit_my_naive( i ) << '\n'; } return 0; } ,程序输出将为

230

答案 1 :(得分:1)

C ++中的内置整数数据类型只能存储给定范围内的值。对于将int64设为-2 63 到2 63 -1(注意:在C ++ 20之前,该标准允许使用不同的有符号整数表示形式,因此从理论上讲,列出的限制是可能相差+/- 1)。如果计算得出的值超出此范围,则将得到整数,并且您的值将从该范围的另一端继续。这就是您看到负值的原因-第239个斐波那契数实际上很大(它的十进制表示法有50位数字),并且不能存储在任何内置数据类型中。

另一方面,只计算第239个斐波纳契数的最后一位,您实际上不需要计算整个值。实际上,对于任何采用十进制表示法的数字,其最后一位数字是除以10后的数字余数(即X的最后一位数字为X%10)。这也适用于算术运算,例如A + B的最后一位为(A % 10 + B % 10) % 10。希望这篇技巧可以帮助您自己解决问题。