【问题标题】:How to do BigInt arithmetic in Dart 2.x, specifically division?如何在 Dart 2.x 中进行 BigInt 算术,特别是除法?
【发布时间】:2019-08-02 04:51:57
【问题描述】:

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

【问题讨论】:

    标签: dart biginteger arithmetic-expressions bigint


    【解决方案1】:

    以下代码有效。

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

    【讨论】:

      猜你喜欢
      • 2014-01-10
      • 1970-01-01
      • 2021-06-21
      • 2020-10-31
      • 1970-01-01
      • 2018-10-09
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多