-1

在 Dart 中是否有比以下(下)更好的数学方法将数字乘以 10 n 倍。我不想使用数学库,因为它会矫枉过正。没什么大不了的;但是,如果有比“for循环”更好(更优雅)的方式,最好是一行,我想知道。

int iDecimals = 3;
int iValue    = 1;

print ("${iValue} to power of ${iDecimals} = ");
for (int iLp1 = 1; iLp1 <= iDecimals; iLp1++) {
  iValue *= 10;
}

print ("${iValue}");
4

5 回答 5

2

你不是提高到十的幂,你是乘以十的幂。那是在你的代码中,答案将是iValue * 10^(iDecimals)提升到权力的方式iValue^10

现在,您的代码仍然包含求幂,它所做的是将 10 提高到幂iDecimals,然后乘以iValue. 加注可能会变得更有效率。(免责声明:我以前从未写过一行 dart 代码,也没有解释器来测试,所以这可能无法立即工作。)

int iValue = 1;
int p = 3;
int a = 10;

// The following code raises `a` to the power of `p`
int tmp = 1;
while (p > 1) {
  if (p % 2 == 0) {
    p /= 2;
  } else {
    c *= a;
    p = (p - 1) / 2;
  }
  a *= a;
}
a *= t;
// in our example now `a` is 10^3

iValue *= a;

print ("${iValue}");

这种求幂算法非常简单,被称为平方求幂。

于 2013-06-02T09:49:41.343 回答
1

使用数学库。您认为这样做是“矫枉过正”的想法是错误的。以下代码更容易编写、更容易阅读、代码行数更少,而且很可能比你可以用它替换的任何东西都快:

import 'dart:math';

void main() {
  int iDecimals = 3;
  int iValue    = 1;

  print("${iValue} times ten to the power of ${iDecimals} = ");
  iValue *= pow(10, iDecimals);
  print(iValue);
}

也许您正在部署到 JavaScript,担心部署规模,却不知道会dart2js发生树抖动?

最后,如果您确实想将一个数字提高到 10 次方,就像您要求但没有做的那样,只需使用pow(iValue, 10).

于 2013-06-02T18:55:03.610 回答
0

考虑到您不想使用任何数学库,我认为这是计算数字幂的最佳方法。此代码片段的时间复杂度似乎也很小。如果您需要单行解决方案,则必须使用一些数学库函数。

顺便说一句,您并没有提高权力,而只是将一个数字乘以 10 n 次。

于 2013-06-02T09:21:41.557 回答
0

因为标准是答案不需要数学库并且需要快速且理想的数学解决方案(不是字符串),并且因为使用指数解决方案需要太多开销 - 字符串,双精度,整数,我认为唯一符合条件的答案如下:

for (int iLp1=0; iLp1<iDecimal; iLp1++, iScale*=10);

它非常快,不需要“数学”库,并且是单行的

于 2013-06-03T10:19:43.963 回答
0

你想用 10 的幂来乘一些东西吗?如果是这样,我相信 Dart 支持科学记数法。所以上面的值可以写成:iValue = 1e3;

等于 1000。如果您想将数字本身提高到 10 的幂,我认为您唯一的其他选择是使用数学库。

于 2013-06-02T09:22:30.457 回答