【问题标题】:Explanation regarding modulo operator and Math.floor function关于模运算符和 Math.floor 函数的说明
【发布时间】:2017-12-05 16:42:43
【问题描述】:

我有两个功能:

function getDigitsSum(number) {
  var sum = 0;

  while (number > 0) {

    sum += number % 10;
    number = Math.floor(number / 10);
  }

  return sum; 
}


function findNumbers() {

   var results = [];

   for (var i = 1; i <= 100; i++) {
      if (getDigitsSum(i) == 8) {
        results.push(i);
      }
   }

   return results;
}

基本上,我显示的是 1 到 100 之间的数字,其数字之和等于 8。我完全理解第二个函数,但不了解第一个函数。

这个我不明白:

while (number > 0) {

    sum += number % 10;
    number = Math.floor(number / 10);
  }

我的问题是:

  1. 模运算符在这部分代码中的作用是什么?我一直认为它只是返回一个操作数除以第二个操作数时剩下的余数。在这里,它似乎有一个我不知道的不同目的。为什么它会做它所做的事情以及如何做?

  2. 我了解Math.floor 函数应该做什么,但不了解(number / 10) 在涉及其余代码时的含义。为什么number除以10?

如果有一个替代代码,当然会给出相同的结果,我会很高兴看到它。

【问题讨论】:

  • % 10 基本上意味着:获取数字的最后一位。 2) 1234 -> 123 -> 12 -> 1
  • number % 10 返回number 的最右边数字。 number / 10 返回去掉最右边数字的数字。
  • 另一种思考方式 - 将如何计算数字的数字总和?
  • @OliverCharlesworth 首先我必须通过它有多少位来识别数字,然后定义每个数字的值,然后将它们相加。从表面上看,我们从最后一个最右边的数字开始,然后稳步走到开头。这是有道理的,我只是不确定它的某些方面是如何工作的,或者为什么这样做。它似乎比直接更迂回。

标签: javascript function modulo


【解决方案1】:

正如函数名所言,它对数字的所有数字求和。 IE。 getDigitsSum(12345) =&gt; 15

对于你的第一个问题: 模运算符(在这种情况下)执行您认为的操作。它将number 除以 10,剩下的作为返回值。因此,11 % 10 为 1,12 % 10 为 2,5 % 3 也为 2。

所以number % 10 给你一个数字的“最右边”数字:12345 =&gt; 5

您的第二个问题: number 除以 10 以切断最右边的数字。这样就完成了,因此循环中的下一次迭代将在 1234 而不是 12345 上运行。

编辑: 关于你关于替代品的最后一个问题。他们有很多。根据您的输入,您可以对字符串而不是数字进行操作:

function getDigitsSum(number) {
    return ('' + number).split('').reduce(function(sum, digit) {
        return sum + Number(digit);
    }, 0)
}

不过,这是否更清晰或更有效还有待商榷。

【讨论】:

  • 当然,你是对的。可能有点太形象了。
【解决方案2】:

x % y (x modulo y) 表示,您对x/y 进行整数除法,然后从 x 中减去其余部分。

例如17%5 = 2 因为int(17/5) = 35*3 = 1517-15 = 2

想法

while (number > 0) {
    sum += number % 10;
    number = Math.floor(number / 10);
}

是,在每个步骤中,您都会得到 number / 10 的余数,这是数字的最后一位数字,然后通过使用 Math.floor(number / 10); 对数字进行整数除法来删除该数字以进行下一步。你一直这样做,直到数字为 0,然后出于明显的原因停止。

【讨论】:

  • 假设你的例子中的数字 17 怎么样?
  • 如前所述,17%10 将是 7,因为 1*10 适合 17,而 17 - 1*10 = 7。有了 7,它会将数字除以 10 和下限 -> Math.floor( 17 / 10 ) = Math.floor( 1.7) = 1,因此 number 在下一次迭代中将是 1,1 % 10 只是 1,因为 10 不适合其中,并且两者sum += ... 将 7 和 1 相加,sum 现在是 8。Math.floor( 1/10 ) 将返回 0,因此 number = 0 并且循环结束。
  • 谢谢你的澄清。还有一个问题。如果除数不是 10,情况会有所不同。在这种情况下使用 10 是否有规则?
  • 在这种情况下,如果你想知道一个数字的最后一位,你必须使用 10。最后一位就是余数,如果你将数字除以 10 就剩下了.12345%10 = 5,因为12340是下一个可以除以10的小数,所以剩下的就是5。你是这个意思吗?
猜你喜欢
  • 2012-04-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2021-03-10
相关资源
最近更新 更多