解题思路
在JavaScript中计算7/3*3,结果是7,而不是6。这是因为JavaScript中除法运算符(/)得到的结果是一个浮点数,而不是一个整数。
具体来说,7/3得到的结果是2.3333…,然后再乘以3得到7.0000…,由于JavaScript采用IEEE 754浮点数标准,所以会对小数进行四舍五入,最终结果为7。
建立sum函数,执行单一功能(求一个数的所有倍数)。
原sumOfMultiples函数,返回所有的计算结果。
时间复杂度为 O(1)
代码
/**
* @param {number} n
* @return {number}
*/
var sumOfMultiples = function(n) {
return sum(n,3) + sum(n,5) + sum(n,7)
- sum(n,21) - sum(n,35) - sum(n,15) + sum(n,105)
};
var sum = function(n, m) {
return ((m +(n-n%m)) * Math.floor(n/m)) / 2
}
容斥原理
什么是容斥原理?
- 所谓容斥原理就是数学中的,交集并集的观念,相同的部分会在不同的公式里面重复执行,需要对相同的部分做差剪掉,同理相同部分重叠两次剪掉的部分也要加回来。
形如:
疑问
为什么有些编译器出来的 7/3*3是 7 而不是 6 ?
- 首先,编译器出来的应该都是 6,因为计算机根据算数运算顺序,从左往右,优先级高的先执行,
- 7/3 = 2 (我们都知道
/
是一个向下取整的除法运算) - 2*3 = 6 (理应得6)
为什么会有 7?
- 我来用另外一个计算方式算一遍
- 7/3 = 2 – 1 (得 2 余 1)
- 2*3 = 6 + 1 = 7(得 6 加 余数 1 得 7)
首先,计算机里面肯定不是这么算的,就如前面得解题说的一样,7/3得到的结果是2.3333...,然后再乘以3得到7.0000...,由于JavaScript采用IEEE 754浮点数标准,所以会对小数进行四舍五入,最终结果为7
在这里我用这种方式(人算讲解了一遍,以便得出相同得结果)
应用
应用过程中我们可以用 Math.floor()
和 ParseInt()
解决进度和向下取整问题