JavaScript题解2652.倍数求和|容斥原理

解题思路

在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
}


容斥原理

什么是容斥原理?

  • 所谓容斥原理就是数学中的,交集并集的观念,相同的部分会在不同的公式里面重复执行,需要对相同的部分做差剪掉,同理相同部分重叠两次剪掉的部分也要加回来。

形如:

image.png


疑问

为什么有些编译器出来的 7/3*3是 7 而不是 6 ?

  • 首先,编译器出来的应该都是 6,因为计算机根据算数运算顺序,从左往右,优先级高的先执行,
  1. 7/3 = 2 (我们都知道 / 是一个向下取整的除法运算)
  2. 2*3 = 6 (理应得6)

为什么会有 7?

  • 我来用另外一个计算方式算一遍
  1. 7/3 = 2 – 1 (得 2 余 1)
  2. 2*3 = 6 + 1 = 7(得 6 加 余数 1 得 7)

首先,计算机里面肯定不是这么算的,就如前面得解题说的一样,7/3得到的结果是2.3333...,然后再乘以3得到7.0000...,由于JavaScript采用IEEE 754浮点数标准,所以会对小数进行四舍五入,最终结果为7

在这里我用这种方式(人算讲解了一遍,以便得出相同得结果)


应用

应用过程中我们可以用 Math.floor()ParseInt() 解决进度和向下取整问题

你可能感兴趣的:(javascript,开发语言,ecmascript,算法)