生成指定数量的质数

为什么做这个

闲着没事又看到自己很久以前做的SKU选择的需求,以前的代码写得逻辑有点乱,我完全看不懂了;

就打算重构一下SKU选择,当时正好看到一篇文章,每个最小单元规格用一个唯一的质数做标记,例如:

红色->2,6G内存->3,128G硬盘->5;那么只要这3个规格组合起来,就是 红色;6G内存;128G硬盘,组合后的规格标记为 2*3*5=30

为什么要这样标记,因为质数只能被1和自身整除,规格组合后,使用唯一质数去做乘积,那么这个乘积也是唯一的;

如果用户选择了部分规格,就可以用已选择规格的乘积去和所有的最终规格乘积去比较,如果 最终规格乘积 除以 当前选择规格的乘积,能整除,证明用户选择的规格,是有效规格;

这样做的话非常容易整体对比;虽然最终我没有用到质数比较的思路,但还是写出来;

代码实现

这里我做的是生成指定数量的质数,比如说100个,那么就会从2开始,生成100个质数,以数组形式返回;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @description: 生成指定数量的质数
* @param {Number} total:想要生成多少个质数
* @return {Array} 生成值以数组形式返回
*/
const getSomePrime = (total) => {
let res = []

//检验一个数字是否为质数
const isPrime = (num) => {
if(+num < 2){
return false
}
let sq = Math.sqrt(num) //开平方根,以平方根作为界限去定义循环的上限
for (let i = 2; i <= sq; i++) {
if (num % i === 0) {
return false
}
}
return true
}

//使用while循环,如果当前生成的结果数量 小于 目标数量,就一直循环
let i = 0;
while(res.length < +total){
if (isPrime(i)) {
res.push(i)
}
i++
}
return res
}

运行看一下结果:

1
2
const result = getSomePrime(100)
console.log(result) // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, ......] 结果太长只展示一部分

生成指定数量的质数
https://liujiaweb.cn/posts/28828.html
作者
Liu Jia
发布于
2022年7月6日
许可协议