利用JS打印质数

我爱撸码,撸码使我感到快乐!
大家好,我是Counter,今天非常愉快,没有前几天的相对比较复杂的逻辑思维在里面,今天来写写,利用JS打印质数,基本上很多面试,会很经常的考到。
那废话不多说,直接上代码:

// for循环,打印10000以内的质数
        for(var i = 0; i < 10000; i++) {
            // 如果这边函数返回true就意味着当前的i是质数,那么将它打印出来
            if (num(i)) {
                console.log(i);
            }
        }
        // 定义函数,形参a
        function num(a) {
            // 如果a<2或者a取余2等于0,那么就直接return false,因为我们知道质数的定义是,只能被1和它自己本身整除,那么能被2整除的肯定都不是质数了
            if ( a < 2 || a % 2 == 0) {
                // 但是2是质数,那这边做下特殊处理。如果传进来的实参是2的话那么返回true
                if (a == 2) {
                    return true;
                }
                return false;
            }
            // 这边直接定义变量3,因为偶数全都被我们排除了
            var j = 3;
            // while循环,如果j小于传进来的参数的话,那么进行里面的语句
            while( j < a ) {
                // 如果传进来的参数取余j等于0的话,说明能被整除,那么返回false
                if ( a % j == 0) {
                    return false;
                }
                // 如果取余不为0的话,那么j就再加2,如果j还是小于传进来的参数的话,那么在进行while循环,确保每个数都能除以所有比它小的奇数。
                j += 2;
            }
            // 我们知道3也是质数,那这边3传进来直接就返回true
            return true;
        }

那这边除了用这种方法,其实还有种方法,那就利用函数的立即执行,也是可以的,直接上代码:

// 函数的立即执行,打印一万以内的所有质数
        // 定义函数的立即执行方式
        (function num() {
            // for循环直接从2开始,因为我们知道0,1不是质数,所以直接弃除
            for(var i = 2; i < 10000; i++) {
                // 定义个标志为true
                var flag = true;
                // 再套一层循环,如果j小于i的话,j才自增1,那么意味着,当i为3的时候,才开始进入这个表达式,并且每次都是i取余小于自己的数并且大于等于2的数进行判断
                for( var j = 2; j < i; j++) {
                    // 如果i取余j为0的话说明此时i不是质数,标志等于false
                    if ( i % j == 0) {
                        flag = false;
                    }
                }
                // 等标志为true时打印出来当前的i值,意味着打印出当前的质数
                if (flag) {
                    console.log(i);
                }
            }
        })();

其实我感觉第二种方法非常的简洁,至于性能的话,经过我测试,第二种函数立即执行打印1万以内的所有质数,耗时在500毫秒左右,当然可能也取决于我电脑性能,浏览器性能,不过我拿两者相对比较来说,第一种方法耗时在100~200毫秒之间。第一种方法的性能会高点,确实应该也是这样的,因为第一种方法咱们都给它把偶数判断都给省了,能不快吗?!而第二种的话,要进行二重循环,又要判断所有的,又要除以比自己小的数,不论奇数,偶数。
所以总结: 如果考虑性能的话就选第一种吧,不想考虑性能,想写的简单点,那就写第二种吧,异曲同工,条条大路通罗马,只不过谁快而已。

猜你喜欢

转载自blog.csdn.net/weixin_44103733/article/details/88875989
今日推荐