错误的输出 - 拉马努金阶乘和C++的近似

Wrong output - Ramanujan's approximation of factorial and C++

本文关键字:C++ 阶乘 马努金 输出 错误      更新时间:2023-10-16
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
    int n, k, g;
    float fact;
    cin >> n;
    fact = sqrt(3.14159265359)*pow(n/2.7182818284, n);
    fact *= pow(((8*n + 4)*n + 1)*n + (float)1/30, (float)1/6);
    k=floor(fact);
    g=k%1000000000;
    cout << g << "n";
    
};

我的程序计算 n! 模数 10000000000 的值。对于 n 的小值,它工作得很好。但是对于较大的,它会不断输出-147483648。我的代码有什么问题?

这是

变量fact上的溢出问题,您可以超过float可以容纳的最大值。

实际上,更大的类型,如long doublelong long int不会保存这些巨大的值,你需要更大的类型。

我建议通过将 1 循环到 n 来解决它,在每次迭代时相乘并应用 mod。这将使数量保持较小。

拉马努金的阶乘近似在这里对你没有帮助,因为它不考虑模优势,你可以试试威尔索姆定理