在Swift中是否有与Java的BigInteger类相同的东西?我想在Swift中进行大型计算,正整数大于UInt64的最大数.处理这些数字的最佳方法是什么?
我有一个定点bignumber库,想要实现快速阶乘,没有精度损失.
在纸上做了一些数学技巧后,我得到了这个公式:
(4N)!=((2N)!).((2N)!).{ (2N+1).(2N+3).(2N+5)...(4N-1) }.(2^N)/(N!)
Run Code Online (Sandbox Code Playgroud)
这已经非常快了,并且通过一些编程技巧,复杂性接近~ O(log(n)).
要清楚,我目前的实现是:
//---------------------------------------------------------------------------
longnum fact(const DWORD &x,longnum &h) // h return (x>>1)! to speed up computation
{
if (x==0) { h=1; return 1; }
if (x==1) { h=1; return 1; }
if (x==2) { h=1; return 2; }
if (x==3) { h=1; return 6; }
if (x==4) { h=2; return 24; }
int N4,N2,N,i; longnum c,q;
N=(x>>2);
N2=N<<1;
N4=N<<2;
h=fact(N2,q); // get 2N! and N!
c=h*h; for (i=(N2+1)|1;i<=N4;i+=2) c*=i; c/=q; // c= …Run Code Online (Sandbox Code Playgroud) 我写了这个函数来返回给定数字的阶乘
func factorial(_ n: Int) -> Int {
if n == 0 {
return 1
}
else {
return n * factorial(n - 1)
}
}
print( factorial(20) ) // 2432902008176640000
Run Code Online (Sandbox Code Playgroud)
只要给定的数字不超过20,就可以正常工作,因为那样结果会变得太高?
我如何规避这个限制,从而计算出更高数字的阶乘?
我已经四处搜索并找到了Swift的一些bignum库,我这样做是为了学习并熟悉Swift,因此我想自己解决这个问题.