如何在JavaScript中实现质数数组的降序排列?
如何实现降序排列的100以内质数数组?
嘿,当然可以通过反转质数数组来实现降序需求,不过先看看你现有代码里的小问题——最后那段倒序遍历的循环,数组索引是从0开始的,primos.length这个位置根本不存在元素,所以会先输出undefined,之后才是正确的质数。咱们先把这个bug修好,再给你几种更简洁的实现思路:
方案一:修复原有的倒序遍历逻辑
只需要把循环的起始索引改成primos.length - 1,同时让循环条件包含i >= 0,就能正确遍历到所有元素:
var primos = []; for (var i = 0; i <= 100; i++) { var fake = false; for (var j = 2; j <= i; j++) { if (i%j==0 && j!=i) { fake = true; } } if (fake === false) { primos.push(i); } } // 修复索引问题,从最后一个有效元素开始遍历 for(i = primos.length - 1; i >= 0; i--) { console.log(primos[i]); }
方案二:用reverse()方法直接反转数组
收集完升序的质数数组后,调用数组自带的reverse()方法就能一键反转成降序,之后直接遍历输出就行:
var primos = []; for (var i = 0; i <= 100; i++) { var fake = false; for (var j = 2; j <= i; j++) { if (i%j==0 && j!=i) { fake = true; } } if (fake === false) { primos.push(i); } } // 反转数组得到降序排列 primos.reverse(); // 遍历输出每个质数 primos.forEach(num => console.log(num));
方案三:直接从大到小遍历收集质数
如果不想额外做反转或倒序遍历,咱们可以直接从100开始往下遍历,符合质数条件的就加入数组,这样得到的数组本身就是降序的,一步到位:
var primos = []; // 从100倒着遍历到0 for (var i = 100; i >= 0; i--) { var fake = false; for (var j = 2; j <= Math.sqrt(i); j++) { // 这里优化了质数判断的循环范围,提升性能 if (i%j==0 && j!=i) { fake = true; break; // 找到因数就立刻终止内层循环,不用做无用功 } } if (fake === false) { primos.push(i); } } // 直接输出就是降序的质数 primos.forEach(num => console.log(num));
顺便提个小优化:判断质数时,内层循环不需要遍历到i,只需要到Math.sqrt(i)就足够了——因为如果i有大于平方根的因数,那对应的另一个因数肯定小于平方根,这样能减少很多不必要的循环,让代码跑得更快~
内容的提问来源于stack exchange,提问作者Pedro Sturmer
相关产品推荐
相关产品推荐

