首先,题目大概是:
2520是1到10这个区间所有自然数的最小乘积,求1到20这个区间的所有自然数的最小乘积
我理解为就是求最小公倍数。
面试的时候没有写出来,但是我写了个思路就是用reduce来做,大意是 当前的值 = 当前乘积 % 当前值 == 0 ? 当前的值 : 当前的值 * 当前乘积。
好像是不太明白,但我认为就是这个思路,当时没写出来,回家后写了一下,大致代码:
var arr = []; for(var i = 1; i <= 10; i++){ arr.push(i); //生成数组 } arr.reduce((a, b) => { return a % b == 0 ? a : a * b; })
很奇怪,这里的答案是7560而不是2520,是哪里出了什么问题?而7560刚好是2520的3倍,百思不得其解啊。
想了一天,和朋友们对了一下思路,发现是当前乘积取模当前值等于零这出了问题,因为当前值它如果不是质数,那么它就是由质数组成的,需要把它分解成组成它的质数。
然后今天整理了一下,把代码写出来了:
//将一个非质数分解成质数
function getPrime(n) { var PrimeList = getPrimeList(n); var prime = n; for (var i = 0; i < PrimeList.length; i++) { if (n % PrimeList[i] == 0) { prime = PrimeList[i]; break; } } return prime; } // 获取1-n中的质数,将它们放到数组,成为质数数组 function getPrimeList(n) { var arr = []; for (var i = 2; i < n; i++) { var flag = true; for (var j = 2; j < i; j++) { if (i % j == 0) { flag = false; } } if (flag) { arr.push(i); } } return arr; } var arr = []; for (var i = 1; i <= 10; i++) { arr.push(i); } //当前值 = 当前乘积 % 当前值 == 0 ? 当前值 : 当前乘积 * 当前值组成的质数 //这里是当前值组成的质数而不是当前值 arr.reduce((accumulator, current) => { var prime = getPrime(current); return accumulator % current == 0 ? accumulator : accumulator * prime; }, 1);
//2520
那么看一下1至20的自然数的最小乘积呢,232792560,落下了心头的一块石头...