Как сделать BigInt арифметику в Dart 2.x, в частности, деление? - PullRequest
1 голос
/ 11 марта 2019

В документации Dart сказано, что подразделение BigInt возвращает значение типа 'double'.Это проблема.Для иллюстрации приведем две реализации алгоритма, включающего деление.Первый в Котлине, второй в Дартсе.Версия 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
}

Dart

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.

Вот пример ввода с ответом.Ошибочный ответ Дарт дан ниже.

height(13, 550), 
          equals(BigInt.parse('60113767426276772744951355')));

Ошибочный ответ Дарт -> 60113767426276764034189615

Может кто-нибудь показать мне лучший способ выполнить работу в Dart v2.x

1 Ответ

2 голосов
/ 11 марта 2019

Работает следующий код.

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 + 1 и x = x - 1, но BigInt. + и BigInt .- принимают только значения BigInt ... поэтому есть ошибка компилятора.
  • BigInt ./ возвращает double, и этоэто не то, что вы хотите здесь.Вместо этого вам нужно использовать оператор BigInt. ~ / .
...