JavaScript 在一个区间里求素数

我们先来明确一下什么是素数:
素数也叫质数,素数是指在大于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张图片
解题思路:
1. 从 2 开始排除它自己,如果还能被分解为 a 和 b,那么它一定不是素数;
2. 首先写一个分解函数,判断由它分解之后的 a * b = 它;
3. 把 a 和 b 放进判断素数的函数里,结果都为true ,则这个数满足条件

JavaScript 在一个区间里求素数_第2张图片

算法如下:

	
	// 判断素数
    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 在一个区间里求素数_第3张图片
解题思路:
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 在一个区间里求素数_第4张图片

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

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

推荐阅读:

Vue动态换肤
小鲨鱼
Css手绘图形
Dom树 CSS树 渲染树
Git 基础命令与事件详解

你可能感兴趣的:(JS,javascript)