我们先来明确一下什么是素数:
素数也叫质数,素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
所以 1 不是素数,2是素数。


我们可以用一个简单的for循环来求一个数是不是素数,如果这个数是素数,那么除了1 和它本身外,一定没有其它的因数。
解题思路:
1.先定义一个变量 flag = true 默认这个数为素数
2.在循环开始前就过滤掉 1 和它自身
3.如果这个数还能被别的数取余成功,那么他一定不是素数

function isSu(num) {
let flag = true;
// 先定义一个变量 flag = true 默认这个数为素数
for(let i = 2; i < num; i++) {
// 在循环开始前就过滤掉 1 和它自身
if(num%i == 0) {
// 如果这个数还能被别的数取余成功,那么他一定不是素数
flag = false
break;
}
}
return flag
}

如果我们想要求出 2 - 150内的所有素数,那么:

let arr = []
for(let num = 2; num <= 150; num++) {
isSu(num) ? arr.push(num) : ''
}

理由如下:循环2 - 150之内的每个数,把它放进写好的函数里,如果return 的结果为 true,说明它不能被其它数整除。这就是我们想要的素数,把它添加到空数组里。否则不予处理。
对结果进行去重,就得出了答案

​ console.log(new Set(arr))​​​

好,看到这里就说明你已经完全掌握了素数的基本概念,我们来拓展一个小练习,规则如下:

题目要求:
  1.首先这个数本身不是素数;
  2.这个数可以分解为 a 和 b的乘积;
  3.a 和 b 都是素数
求 [150 , 200] 所有满足条件的数


JavaScript 在一个区间里求素数_回文数


解题思路:

1. 从 2 开始排除它自己,如果还能被分解为 a 和 b,那么它一定不是素数;

2. 首先写一个分解函数,判断由它分解之后的 a * b = 它;

3. 把 a 和 b 放进判断素数的函数里,结果都为true ,则这个数满足条件


JavaScript 在一个区间里求素数_判断素数_02


算法如下:

// 判断素数
function isSu(num) {
let flag = true;
for(let i = 2; i < num; i++) {
if(num%i == 0) {
flag = false
break;
}
}
return flag
}

let arr = [];
// 分解一个数
function fen(num) {
for(let i = 2; i < num; i++) {
for(let j = 2; j < num; j++) {
if(i * j === num) {
isSu(i) && isSu(j) ? arr.push(num) : ''
}
}
}
}

// 计算 150 ~ 200 以内满足条件的数
for(let i = 150; i <= 200; i++) {
fen(i)
}
// 对结果进行去重
console.log(new Set(arr))

答案是12个:
0: 155
1: 158
2: 159
3: 161
4: 166
5: 169
6: 177
7: 178
8: 183
9: 185
10: 187
11: 194

练习题:

回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。
例如,2,3,5,7,11 以及 13 是素数。
回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。
例如,12321 是回文数。

​​​10 ^ 8 <= N <= 2 * 10 ^ 8​​ 求出大于或等于 N 的最小回文素数。

​题目来源​

请将你的答案打在评论区与我印证。我们一起学习共同进步。


JavaScript 在一个区间里求素数_回文数_03


解题思路:

1. javaScript 里 a 的 b 次幂写作 Math.pow(a, b);

2. 可以先求出所有的回文数,把回文数逐个放进 判断素数的函数里(反向也可以);

3. 假设一个num = 12321,将它转换为字符串,那么num[0] === num[num.length - 1] 项,不难看出一个规律 num [n] === num [num.length - 1 - n];


算法如下:

// 判断素数的函数
isSu(num) {
let flag = true;
for(let i = 2; i < num; i++) {
if(num%i == 0 ) {
flag = false
break;
}
}
flag ? console.log(num) : ''
},
// 判断回文数的函数
back() {
let flag;
for(let i = Math.pow(10, 8); i< 2 * Math.pow(10, 8); i++) {
flag = true;
// 默认它是一个回文数
i += ''
// 将 i 转换为字符串格式,才可以进行下标的选择 i[n]
for(let j = 0; j < parseInt(i.length / 2); j++) {
// j < i.length 也可, 将循环次数设置为 i 长度的一半(向下取整)可以减少一些计算量
if(i[j] !== i[i.length - 1 - j]) {
flag = false
// 有不等项,那么它不是一个回文数
}
}
flag ? isSu(i) : ''
}
},

我把计算结果打在评论区了,跟我一起验证一下吧



到底了!原创不易,转载请注明出处。

JavaScript 在一个区间里求素数_判断素数_04

  前端的学习不是一蹴而就,不积跬步无以至千里,不积小流无以成江海。持续不断的努力才能让你我有所收获

  不辜负每一份真情,不嘲笑每一个正在努力的人,力所能及的对别人施以援手,每天都要强化自己,洗去铅华才能绽放光芒。