作为我的 BigDecimal 库的一部分,我需要计算任何给定非负整数的阶乘。所以我使用 .Net 4.0System.Numerics.BigInteger
来存储大量数字。这是我正在使用的功能:
private BigInteger Factorial(BigInteger x)
{
BigInteger res = x;
x--;
while (x > 1)
{
res *= x;
x--;
}
return res;
}
它可以工作,但没有优化。现在我想使用并行计算,所以这是我尝试过的:(我没有并行编程经验)
public BigInteger Factorial(long x)
{
BigInteger res = 1;
ParallelLoopResult r = Parallel.For(2L, (x + 1), i =>
res *= i
);
return res;
}
奇怪的问题是,上面的函数非常适合像 5 这样的小数字!但不适用于像 1000 这样的大数字!并且每次返回完全不同的结果。所以我意识到它不是线程安全的,问题出在变量res
上。我想知道正确的实现是什么?
如果我可以使用 BigInteger 而不是 long 作为 variable 会更好x
。