如何在 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;
}

变化:

  • x++x-- 等同于 x = x + 1x = x - 1 但是 BigInt.+ and BigInt.- 只接受 BigInt 值...所以有一个编译器错误。
  • BigInt./ returns a double and this is not what you want here. You need to use the BigInt.~/ 运算符。