如何在 Dart 2.x 中进行 BigInt 运算,特别是除法?
How to do BigInt arithmetic in Dart 2.x, specifically division?
Dart 文档说 BigInt 除 returns 类型 'double' 的值。这是个问题。为了说明这一点,这里有两个涉及除法的算法实现。第一个在 Kotlin 中,第二个在 Dart 中。 Dart 版本对较小的数字运行准确,但对较大的数字失去精度。
Kotlin
import java.math.BigInteger
fun height(n: BigInteger, m: BigInteger): BigInteger {
var m1 = m
var s = BigInteger("1")
var b = BigInteger("1")
var ans = BigInteger("0")
var i = 0
while (i < n.toInt()) {
s *= m1--
s /= b++
ans += s
i++
}
return ans
}
飞镖
BigInt height(int n, int m) {
var m1 = m; // new BigInt.from(m);
var s = 1.0; // new BigInt.from(1);
var b = 1.0; // new BigInt.from(1);
var ans = new BigInt.from(0);
var i = 0;
while (i < n) {
s *= m1--;
s /= b++;
ans += BigInt.from(s);
i++;
}
return ans;
}
从注释掉的Dart代码可以看出,我已经尝试了多种方式来使用BigInt。
这是一个带答案的输入示例。下面给出了错误的 Dart 答案。
height(13, 550),
equals(BigInt.parse('60113767426276772744951355')));
错误的 Dart 答案是 --> 60113767426276764034189615
谁能告诉我在 Dart 中完成这项工作的最佳方法 v2.x?
以下代码有效。
BigInt height(int n, int m) {
var m1 = new BigInt.from(m);
var s = new BigInt.from(1);
var b = new BigInt.from(1);
var ans = new BigInt.from(0);
var i = 0;
while (i < n) {
s *= m1;
m1 -= new BigInt.from(1);
s = s ~/ b;
b += new BigInt.from(1);
ans += s;
i++;
}
return ans;
}
变化:
Dart 文档说 BigInt 除 returns 类型 'double' 的值。这是个问题。为了说明这一点,这里有两个涉及除法的算法实现。第一个在 Kotlin 中,第二个在 Dart 中。 Dart 版本对较小的数字运行准确,但对较大的数字失去精度。
Kotlin
import java.math.BigInteger
fun height(n: BigInteger, m: BigInteger): BigInteger {
var m1 = m
var s = BigInteger("1")
var b = BigInteger("1")
var ans = BigInteger("0")
var i = 0
while (i < n.toInt()) {
s *= m1--
s /= b++
ans += s
i++
}
return ans
}
飞镖
BigInt height(int n, int m) {
var m1 = m; // new BigInt.from(m);
var s = 1.0; // new BigInt.from(1);
var b = 1.0; // new BigInt.from(1);
var ans = new BigInt.from(0);
var i = 0;
while (i < n) {
s *= m1--;
s /= b++;
ans += BigInt.from(s);
i++;
}
return ans;
}
从注释掉的Dart代码可以看出,我已经尝试了多种方式来使用BigInt。
这是一个带答案的输入示例。下面给出了错误的 Dart 答案。
height(13, 550),
equals(BigInt.parse('60113767426276772744951355')));
错误的 Dart 答案是 --> 60113767426276764034189615
谁能告诉我在 Dart 中完成这项工作的最佳方法 v2.x?
以下代码有效。
BigInt height(int n, int m) {
var m1 = new BigInt.from(m);
var s = new BigInt.from(1);
var b = new BigInt.from(1);
var ans = new BigInt.from(0);
var i = 0;
while (i < n) {
s *= m1;
m1 -= new BigInt.from(1);
s = s ~/ b;
b += new BigInt.from(1);
ans += s;
i++;
}
return ans;
}
变化: