前端JS算法之素数

1,659 阅读2分钟

在看代码之前,我们先梳理一下逻辑,什么是素数,百度百科上写到,素数又称质数,质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。那我们可以理解为只能被1它本身整除的数就是素数。

逻辑步骤:
1、整除余数肯定为0
2、JS里面有求余符号 %,我们可以判断余数是否为0。
3、一个质数只能被1它本身整除2次,也就是余数为0的次数只能是2
4、使用for循环,对这个整数从1它本身之间的整数(包括1和它本身)求余。
5、声明一个变量num,记录余数为0的次数
6、根据步骤3,判断num(余数为0的次数)是否大于2,如果大于2,则说明这个整数不是质数,反之,这个数就是质数。因为质数只能被1它本身整除,也就是余数为0的次数只能2次。


接下来看代码
第一种方法:

function primeNum(val) {
    let n = val && parseInt(val);
    // 声明变量,记录余数为0的次数
    let num = 0;
    // for循环 i初始值从1开始
    for(let i = 1; i <= n; i++) {
    	// 求余,并判断余数是否等于 0 ,如果等于 0 ,则 num 加 1
        if(n % i == 0) {
            num++ 
        }
    }
    // 判断 num 是否大于2,大于 2 是合数,否则就是质数
    if(num > 2) {
        console.log(n + ' 是合数')
    } else {
        console.log(n + ' 是质数')
    }
}
primeNum(7) // 7 是质数

基于第一种方法我们优化一下,质数求余为0的有2次,只能被1它本身整除,那我们把这两次去掉就可以了。
第二种方法:

function primeNum(nub) {
    let n = parseInt(nub);
    // 声明变量num,初始值为true
    let isPrime = true;
    /* 
    	for循环里面的 i 变量初始值从2开始,去掉了可以整除的 1,把等号删掉,
    	可以去除它本身
    */
    for(let i = 2; i < n; i++) {
        if(n % i == 0) {
        	/*
              		走到这里,说明这个整数除了1和他本身之外,还可以被其他数整除,
              		isPrime变为false,同时终止循环
		*/ 
            isPrime = false;
            break;
        }
    }
    if(!isPrime) {
        console.log(n + ' 是合数')
    } else {
        console.log(n + ' 是质数')
    }
}
primeNum(7)