前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript 在一个区间里求素数

JavaScript 在一个区间里求素数

作者头像
我不是费圆
发布2022-10-28 15:35:22
3490
发布2022-10-28 15:35:22
举报
文章被收录于专栏:鲸鱼动画鲸鱼动画

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

代码语言:javascript
复制
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内的所有素数,那么:

代码语言:javascript
复制
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 ,则这个数满足条件



算法如下:

代码语言:javascript
复制
	// 判断素数
    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];

算法如下:

代码语言:javascript
复制
  // 判断素数的函数
  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) : ''
      }
    },

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档