递归c++;为多个条目提供负值的阶乘 我对C++有点陌生,我正在尝试编写递归因子计算器。我确实写过,但它为20、21、22、33、40等条目提供了多个负值,而且尽管我尝试使用long-long int,但代码无法计算大于65的整数的阶乘。有人能向我解释为什么会发生这种情况吗?我在python中没有任何问题。为什么它在C++中发生?
这是我的密码:递归c++;为多个条目提供负值的阶乘 我对C++有点陌生,我正在尝试编写递归因子计算器。我确实写过,但它为20、21、22、33、40等条目提供了多个负值,而且尽管我尝试使用long-long int,但代码无法计算大于65的整数的阶乘。有人能向我解释为什么会发生这种情况吗?我在python中没有任何问题。为什么它在C++中发生?,c++,C++,这是我的密码: #include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; long long int factorial(long int n) { long long int temp; if (n == 1 || n == 0) { return 1; } else { temp = n*fact
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
long long int factorial(long int n) {
long long int temp;
if (n == 1 || n == 0) {
return 1;
}
else {
temp = n*factorial(n - 1);
return temp;
}
}
int main()
{
int n, i;
cout << "Enter positive integer or zero: ";
cin >> n;
while (n < 0 || cin.fail()) {
cout << "\nFactorial cannot be calculated for n is negative." << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Please try with integer >= 0: ";
cin >> n;
}
cout << factorial(n) << endl;
_getch();
return 0;
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
长整型阶乘(长整型n){
长内温;
如果(n==1 | | n==0){
返回1;
}
否则{
温度=n*阶乘(n-1);
返回温度;
}
}
int main()
{
int n,i;
cout>n;
而(n<0 | | cin.fail()){
cout n;
}
cout这是一个简单的溢出问题。您已经知道python的结果,所以您可以检查它对于您正在使用的类型是否太大(显然是这样)
至于python,它有内置的支持:
使用C++ BigIt库。
< P>这是一个简单的溢出问题。您已经知道了Python的结果,因此您可以检查它是否对您使用的类型太大(很明显)。
至于python,它有内置的支持:
使用C++ Bigint库。
< P>你所经历的是整数溢出的未定义行为。你使用的是长long int /COD>这是一个符号整数,最有可能被表示为8字节整数(这是平台特定的)。
从这里假设您的long-long-int
只有8个字节(64位),这意味着它可以存储的最大正值约为2^63
,约为9.223372037e+18
尝试计算数字的阶乘,如20、21、22、33、40等,将导致一个值大于long-long-int
可以存储的最大值,这将导致未定义的行为,在本例中表现为整数环绕
为了修复这一点,你需要使用一个表示较大值的整数数据类型CABAAL。我先切换到<代码>未签名的长long int /代码>,它会给你两倍的数值,因为一个无符号类型只处理正数。不过,这只是一个创可贴。我需要找到一个做任意精度整数数学的库。(一个bigint库)
(您还可以执行一些特定于平台的操作,要求编译器输入128位int,但更好的解决方案是切换到bigint数据类型)
编辑:
我应该用“bigint”来澄清这一点我不一定指的是任何特定的库。正如评论中所建议的,有多个选项可以用来选择哪个库来完成工作。由于整数溢出,您遇到的是未定义的行为。您使用的是long-long-int
,这是一个最有可能是repr的有符号整数E表示为8字节整数(这是特定于平台的)
从这里假设您的long-long-int
只有8个字节(64位),这意味着它可以存储的最大正值约为2^63
,约为9.223372037e+18
尝试计算数字的阶乘,如20、21、22、33、40等,将导致一个值大于long-long-int
可以存储的最大值,这将导致未定义的行为,在本例中表现为整数环绕
为了修复这一点,你需要使用一个表示较大值的整数数据类型CABAAL。我先切换到<代码>未签名的长long int /代码>,它会给你两倍的数值,因为一个无符号类型只处理正数。不过,这只是一个创可贴。我需要找到一个做任意精度整数数学的库。(一个bigint库)
(您还可以执行一些特定于平台的操作,要求编译器输入128位int,但更好的解决方案是切换到bigint数据类型)
编辑:
我应该用“bigint”来澄清这一点我不一定是指任何特定的库。正如评论中所建议的,有多种选择可以使用哪个库来完成工作。多长是long int
?21!是一个66位整数,可能long-long int
只有64位。多长是long-long int
?21!是一个66位整数,可能long-long-int
只有64位。可能的重复感谢您的解释,但是我们可以说像21这样的低整数的值的求反也与堆栈溢出有关吗?这是我得到的21的阶乘值:-4249290049419214848谢谢您的解释,但是我们可以说负吗非常低的整数(如21)的值的求反也与堆栈溢出有关?这是我得到的21的阶乘值:-4249290049419214848非常感谢!求反问题由“unsigned long long int”解决。但是我尝试包含bigint库,但它看起来不再受支持。我使用的是Visual studio 2015我没有看到任何像'bigint'@Singiton Use这样的库。你可以看到更多的@Singiton请记住,使用无符号长整型
并不能解决你的问题。你可能再也看不到任何负数了,但你仍然会得到我上面描述的未定义行为。你仍将尝试计算数字大于任何内置整数类型中可以存储的内容。@Alex我明白你的意思,这就是为什么我提供了指向bigint库的链接。我将尝试上面提供的boost::multprecision解决方案。按照安装,然后它就工作了。非常感谢