#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 的值!模 1000000000。对于较小的 n 值,它工作得很好。但对于较大的,它会不断输出 -147483648。我的代码有什么问题?
最佳答案
这是变量 fact
的溢出问题,您超出了 float
可以容纳的最大值。
实际上,像 long double
和 long long int
这样更大的类型将无法容纳这些巨大的值,您需要更大的类型。
我建议通过循环 1 到 n 来解决它,在每次迭代时相乘并应用 mod。这将使数量保持较小。
Ramanujan 的阶乘近似在这里对你没有帮助,因为它没有考虑 mod 优势,你可以试试 Wilsom Theorem
关于c++ - 错误的输出 - Ramanujan 对阶乘和 C++ 的近似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34376245/