我正在尝试使用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位以上的数字吗?
答案 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
。希望这篇技巧可以帮助您自己解决问题。