Reusive factorial函数在“22!”上产生错误的结果

时间:2017-10-04 05:07:29

标签: c++ factorial

我正在制作一个小因子函数,以帮助我为函数做一些数学运算。

#include<iostream>
using std::cout;
using std::endl;
class HandsShaking{
    private:
    unsigned long long fac(int n){
        return fac(n, 1);
    }

    unsigned long long fac(unsigned long long n, unsigned long long ret){
        if(n == 1){
            return ret;
        }else{
            return fac(n-1, ret*n);
        }
    }

   public:
   unsigned long long countPerfect(unsigned long long n){
        unsigned long long m = n/2;
        cout<<fac(n)<<endl;
        cout<<(fac(m+1)*fac(m))<<endl;
        return fac(n)/(fac(m+1)*fac(m));
    }
};

我在任何地方使用尾递归和无符号长long,所以我怀疑它是溢出的。

很抱歉,我没有将功能和定义分开,但我的提交(计数完美功能)指定了一个文件。

该功能似乎适用于最多22个的所有数字,并且在所有数字之后都失败。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用Boost.Multiprecision执行此类任务。

#include <iostream>

#include <boost/multiprecision/cpp_int.hpp>

using boost::multiprecision::cpp_int;

cpp_int factorial(cpp_int x)
{
    if (x == cpp_int{1}) return cpp_int{1};
    return x*factorial(x-1);
}

int main()
{
    cpp_int n{22};
    std::cout << factorial(n) << '\n';
}

Live example