lia*_*923 31 int largenumber biginteger swift
在Swift中是否有与Java的BigInteger类相同的东西?我想在Swift中进行大型计算,正整数大于UInt64的最大数.处理这些数字的最佳方法是什么?
您可以使用NSDecimalNumber
Cocoa中的类.它不是无限精度,但它可以表示38个十进制数字的精度,这可能足以满足您的需要.
我也在研究一个BigNumber库,你可以用它来做大量的计算.实际上该库基于GNU多精度(GMP)库,我编写了一个Objective-C/Swift包装器.目前大整数数学,包括很多运算符重载,都是可能的.代码示例如下:
var err : NSError?
var bi1 = BigInt(nr: 12468642135797531)
var bi2 = BigInt(nr: "12345678901011121314151617181920", error: &err)
var res = bi1 * bi2
println("Multiply 2 BigInts: bi1 * bi2 = \(res.toString())")
Run Code Online (Sandbox Code Playgroud)
这导致:
Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520
Run Code Online (Sandbox Code Playgroud)
您可以在以下网址找到该库:https://github.com/githotto/osxgmp
我为swift写了一个大整数和大的双重实现,不需要任何额外的库.只需将其复制到您的项目中.它支持整数(BInt)和分数(BDouble)与大多数常见的数学运算符,如加法,减法,乘法,取幂,模数和除法.还实现了一些优化的数学函数,如factorial或gcd.
以下是一些代码示例:
// Create a new number:
let num = BInt(232)
print(num) // prints "232"
// You can also use Strings to create a number:
let veryBig = BInt("-827846184963421874362418746238453267452971345218746328715380000000000")
// Every standard math operator works well, even with normal Integers
// Visit the github page for more informations
let v0 = (BInt(5) + BInt(4)) - BInt(3)
let v1 = veryBig * 1000
let v2 = vergBig ^ num
let v3 = (veryBig ^ 50000) / (BInt(2) ^ 900) + 1
let v4 = gcd(abs(veryBig), num)
// BDouble is very similar, you can find a detailed description on Github
let fraction = BDouble("27", over: "31")
print(fraction) // prints "27/31"
Run Code Online (Sandbox Code Playgroud)
您可以自由使用它而不给予我信任,如果您愿意,请提供帮助.
你可以在这里找到它:https://github.com/mkrd/Swift-Big-Integer
我写了一个库,允许你在Swift中使用大整数.与Java的BigInteger类似.还有操作员重载以使工作更方便.例:
let a = BigInteger("111111111111111111111111111111111111111111111110000000001")!
let b = 999_999_999
let c = a + b // 111111111111111111111111111111111111111111111111000000000
Run Code Online (Sandbox Code Playgroud)
https://github.com/kirsteins/BigInteger
这里是.
https://github.com/dankogai/swift-pons
实际上BigInt只是其中的一部分.除了BigInt,你还得到:
但最重要的是,它是面向协议的,所以你可以扩展整数,如:
import PONS
func fib<T:POInteger>(n:T)->T { // with a little better algorithm
if n < T(2) { return n }
var (a, b) = (T(0), T(1))
for _ in 2...n {
(a, b) = (b, a+b)
}
return b
}
let F11 = fib(11 as Int8)
let F13 = fib(13 as UInt8)
let F23 = fib(23 as Int16)
let F24 = fib(24 as UInt16)
let F46 = fib(46 as Int32)
let F47 = fib(47 as UInt32)
let F92 = fib(92 as Int64)
let F93 = fib(93 as UInt64)
let F666 = fib(666 as BigInt)
Run Code Online (Sandbox Code Playgroud)
数字生成器丹
我在官方的Swift资料库中找到了BigInt的原型:https://github.com/apple/swift/blob/master/test/Prototypes/BigInt.swift
您可能只是将其复制到项目中并使用它。也许有一天它将被添加到标准库中。