如何在Dart 2.x中进行BigInt算术,特别是除法?

时间:2019-03-11 19:44:23

标签: dart biginteger arithmetic-expressions bigint

Dart文档说BigInt除法返回的值类型为“ double”。这是个问题。为了说明,这是涉及除法的算法的两种实现。第一个在Kotlin,第二个在Dart。 Dart版本对于较小的数字可以准确运行,但是对于较大的数字则会失去精度。

科特林

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中完成工作的最佳方法吗?

1 个答案:

答案 0 :(得分:2)

以下代码有效。

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.+BigInt.-仅接受BigInt值...所以有一个编译器错误。
  • BigInt./返回一个double,这不是您想要的。您需要使用BigInt.~/运算符。