我们先来明确一下什么是素数: 素数也叫质数,素数是指在大于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++) {
this.isSu(num) ? this.arr.push(num) : ''
}
理由如下:循环2 - 150之内的每个数,把它放进写好的函数里,如果return 的结果为 true,说明它不能被其它数整除。这就是我们想要的素数,把它添加到空数组里。否则不予处理。 对结果进行去重,就得出了答案
console.log(new Set(arr))
好,看到这里就说明你已经完全掌握了素数的基本概念,我们来拓展一个小练习,规则如下:
题目要求: 1.首先这个数本身不是素数; 2.这个数可以分解为 a 和 b的乘积; 3.a 和 b 都是素数 求 [150 , 200] 所有满足条件的数
解题思路: 1. 从 2 开始排除它自己,如果还能被分解为 a 和 b,那么它一定不是素数; 2. 首先写一个分解函数,判断由它分解之后的 a * b = 它; 3. 把 a 和 b 放进判断素数的函数里,结果都为true ,则这个数满足条件
算法如下:
// 判断素数
function isSu(num) {
let flag = true;
for(let i = 2; i <= num; i++) {
if(num%i == 0 && i!==1 && i!=num) {
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 的最小回文素数。
请将你的答案打在评论区与我印证。我们一起学习共同进步。
解题思路:
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) : ''
}
},
我把计算结果打在评论区了,跟我一起验证一下吧