我有两个功能:
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);
}
我的问题是:
模块运算符在这部分代码中的作用是什么?我总是认为它只返回当一个操作数除以第二个操作数时剩余的余数。在这里它似乎有一个我不知道的不同目的。它为什么做它做什么以及如何做?
我理解Math.floor
函数应该做什么,但不了解(number / 10)
关于其余代码的含义。为什么number
确切地除以10?
如果有一个替代代码,当然会得到相同的结果,我很高兴看到它。
答案 0 :(得分:0)
就像函数的名称所示,它会在数字的所有数字上构建总和。即getDigitsSum(12345) => 15
。
关于你的第一个问题:
模运算符(在本例中)执行您认为的操作。它将number
除以10,其余为返回值。因此,11 % 10
为1,12 % 10
为2,5 % 3
为2。
因此,number % 10
会为您提供数字的“最右侧”数字:12345 => 5
你的第二个问题:
将number
除以10以切断最右边的数字。这样做了,因此循环中的下一次迭代将在1234
而不是12345
上运行。
修改强>: 关于你关于替代品的最后一个问题。有很多。根据您的输入,您可以使用String而不是Number:
function getDigitsSum(number) {
return ('' + number).split('').reduce(function(sum, digit) {
return sum + Number(digit);
}, 0)
}
然而,这是更清晰或更有效的问题,可以讨论。
答案 1 :(得分:0)
x % y
(x modulo y)表示您执行整数除法x/y
并从x中减去其余部分。
e.g。 17%5 = 2
因为int(17/5) = 3
,5*3 = 15
,17-15 = 2
。
的想法
while (number > 0) {
sum += number % 10;
number = Math.floor(number / 10);
}
是,在每一步中,你得到number / 10
的余数,这是数字的最后一位数,然后通过使用{{1}对数字进行整数除法来删除下一步的数字}。你一直这样做,直到数字为0,然后因显而易见的原因停止。