基于自然数因数个数重排整数数组(要求用for循环实现)
按自然数因数个数重排数组(基于for循环实现)
直接给你修复并完成后的代码,完全用for循环实现排序逻辑:
var number = 1; // 初始化非0值,确保进入输入循环 var array = []; while (number != 0) { number = +prompt("Input a natural number:"); if (number != 0 && Number.isInteger(number) && number > 0) { // 增加自然数合法性校验 array.push(number); } else if (number !== 0) { alert("请输入正自然数!"); } } // 用两层for循环实现冒泡排序:按因数个数从小到大排序 for (var i = 0; i < array.length - 1; i++) { for (var j = i + 1; j < array.length; j++) { // 比较两个元素的因数个数 if (numOfFactors(array[i]) > numOfFactors(array[j])) { // 交换两个元素的位置 var temp = array[i]; array[i] = array[j]; array[j] = temp; } } } console.log("排序后的数组:", array); // 计算单个自然数的因数个数 function numOfFactors(a) { var factors = 0; // 将计数器移至函数内部,每次调用自动重置 for (var i = 1; i <= a; i++) { // 从1遍历到目标数,逻辑更直观 if (a % i === 0) { factors++; } } return factors; }
关键修改&说明:
- 修复因数计数bug:原来的
factors是全局变量,每次调用会累加之前的结果,现在移到函数内部,每次计算都从零开始计数。 - 修正排序参数错误:你之前调用
numOfFactors(i)传的是数组下标,实际应该传数组里的元素array[i]/array[j]。 - 补全两层循环排序逻辑:内层循环从
i+1开始,逐个比较当前元素和后续元素的因数个数,若前者因数更多则交换位置,最终实现升序排序(匹配你给出的示例输出)。 - 增加输入校验:避免用户输入负数、小数等非自然数的情况。
- 清理无用代码:删掉了多余的
numOfFactors(number)调用和无效的console.log(factors)。
测试你给出的示例输入[6,16,7],运行后会输出[7,6,16],完全符合需求。
内容的提问来源于stack exchange,提问作者LukaM
相关产品推荐
相关产品推荐

