JavaScript素数生成函数问题:从1到n存数组却为空
你的素数判断逻辑完全写反啦,这就是数组为空的原因
兄弟,我一眼就瞅出你代码里的问题了——素数判断的逻辑彻底搞反了,再加上循环起始值不对,导致push语句几乎没机会执行,数组自然是空的。咱们一步步拆解问题:
先看你当前的代码:
function solve(args){ var m=new Array(); for(let a=1;a<=args;a++){ for(let b=1;b<=Math.sqrt(a);b++){ if(a%b==0){ break; } m.push(a); } } }
核心问题1:循环起始值+判断逻辑完全颠倒
所有自然数都能被1整除,所以你的内层循环从b=1开始的瞬间,就会触发a%b==0的条件,直接break跳出内层循环——这就导致m.push(a)根本没机会执行!不管a是1还是其他数,全都会因为b=1的判断直接跳出循环,数组当然一直是空的。
而且你现在的逻辑是「找到能整除的数就停止,否则加入数组」,这和素数的判断逻辑完全相反:素数是找不到除了1和自身之外的因数才符合条件,咱们得反过来写。
修正后的代码
结合你把1视为素数的需求,我帮你调整了逻辑,还加了返回语句(原来的函数没返回数组,就算逻辑对了也拿不到结果):
function solve(args){ var m = new Array(); // 单独处理1(按照你的要求视为素数) if(args >= 1) { m.push(1); } // 处理大于1的数 for(let a = 2; a <= args; a++){ let isPrime = true; // 从2开始检查到sqrt(a),找是否有因数 for(let b = 2; b <= Math.sqrt(a); b++){ if(a % b === 0){ isPrime = false; // 找到因数,标记为非素数 break; // 没必要继续检查了 } } if(isPrime){ m.push(a); // 确认是素数再加入数组 } } return m; // 必须返回数组,调用函数才能拿到结果 }
比如你调用solve(10),会返回[1,2,3,5,7],完全符合你的需求。
内容的提问来源于stack exchange,提问作者Y.Ivanov
相关产品推荐
相关产品推荐

