【问题标题】:Math in Dart - working with numbers other than base 10Dart 中的数学 - 使用以 10 为底的数字
【发布时间】:2014-04-28 00:46:54
【问题描述】:

我试图用 10 进制以外的东西做一些数学运算,并希望从 Dart 社区获得一些关于我可以采取的可能方向的意见。

因此,例如,假设 p = 2。然后,查看以 2 为底的 100:

100 = (1 · 26
) + (1 · 25
) + (0 · 24
) + (0 · 23
) + (1 · 22
) + (0 · 21
) + (0 · 20
)

所以

100 base 2 = 1100100

每个数字加 1 并将答案相乘:

(1 + 1)(1 + 1)(0 + 1)(0 + 1)(1 + 1)(0 + 1)(0 + 1) = 8

尝试 3 次:

100 = (1 · 34
) + (0 · 33
) + (2 · 32
) + (0 · 31
) + (1 · 30
)

所以

100 base 3 = 10201

(1 + 1)(0 + 1)(2 + 1)(0 + 1)(1 + 1) = 12

在 Dart 中,我想出了以下内容;

https://gist.github.com/anonymous/11345381

int rows = 1000000000;
      int total = 0;
      for(int i = 0 ; i < rows ; i++ ){
        total += i.toRadixString(7)
            .split('')
            .map((s) => int.parse(s) + 1)
            .reduce((prev,next) => prev*next);
      }
print('${total} results');

这确实有效,并且对于少量行似乎没问题。但是对于更大的数字,它真的很慢。

如图所示,我将 int 转换为字符串(产生数字的字符串表示形式),将其拆分,将拆分的字符映射回 int,将每个 int 加 1,然后将它们全部相乘。

在 Dart 中处理数字时,除了以 10 为基数之外,我是否遗漏了什么?

【问题讨论】:

  • 我仍然不希望你真正想做。您只想在不同基数之间转换数字吗?
  • 与上面的 2 个示例一样,我通过将其转换为基数 X 来获得 100 的值。然后,使用转换后的值,将每个数字加 1 并将总和相乘。转换为 String 然后再转换回来似乎效率低下。但我不确定我还能如何在 Dart 中做到这一点。我的主要动机是使用大量数字来计算它所花费的时间太慢了。
  • 这仍然没有回答我的问题:(你想达到什么目的?将数字转换为其他基数可以这样完成:print((100).toRadixString(2)); print( (100).toRadixString(3)); 1100100 10201
  • 您是否只是想以基数 P 显示一个数字,然后将该表示的所有数字与 +1 相加?然后我看不到另一种方式。我问是因为我想了解它背后的数学背景为什么你需要它。
  • 尝试将.split('').map(...) 更改为.codeUnits.map((x)=&gt;x-47),看看会有多大的不同。

标签: dart


【解决方案1】:

遍历字符串似乎效率低下。直接做怎么办?

int digitProduct(int n, int base) {  // non-negative n and base only
  int product = 1;
  while (n > 0) {
    int digit = n % base;
    n = n ~/ base;
    product *= (digit + 1);
  }
  return product;
}
main() {
  int rows = 1000000000;
  int total = 0;
  for (int i = 0; i < rows; i++) {
    total += digitProduct(i, 7);
  }
  print("${total} results");
}

1000000000 也是一个很大的数字。如果每行需要 1 微秒,则仍需要约 16 分钟才能完成。

任意基数除法很慢。如果您将基数硬编码为 7,它可能会明显更快(我预计在 digitProduct 中花费的大约 90% 的时间用于 ~/ 和 %)。

【讨论】:

  • 快一点。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
相关资源
最近更新 更多