Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归c++;为多个条目提供负值的阶乘 我对C++有点陌生,我正在尝试编写递归因子计算器。我确实写过,但它为20、21、22、33、40等条目提供了多个负值,而且尽管我尝试使用long-long int,但代码无法计算大于65的整数的阶乘。有人能向我解释为什么会发生这种情况吗?我在python中没有任何问题。为什么它在C++中发生?_C++ - Fatal编程技术网

递归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解决方案。按照安装,然后它就工作了。非常感谢