如何遍历同构数组集并逐一取反对应元素?附赞赏数求解需求
赞赏数(Admirable Numbers)问题求解
问题定义
一个数等于其所有真因数的和——前提是其中一个因数为负数。
例如,12的真因数为1、2、3、4、6,总和为16。若将2取反,总和即为12本身,因此12是赞赏数:12 = 1 - 2 + 3 + 4 + 6。
我的目标是找出哪个因数取反后,能让真因数之和等于该数本身。
当前实现思路
我之前做过完全数的类似问题,现在沿用相似思路:先生成目标数的真因数数组(不含自身),再生成由多份相同真因数数组组成的数组。代码如下(已补全原代码遗漏的关键逻辑):
function admirable(n) { // 生成所有因数,再过滤得到真因数(不含自身) function getProperFactors(n) { let factors = []; for(let i = 1; i <= Math.sqrt(n); i++) { if(n % i === 0) { factors.push(i); if(i !== n/i && i !== 1) { // 避免重复添加因数,比如6的因数2和3 factors.push(n/i); } } } factors = [...new Set(factors)].sort((a,b) => a - b); return factors.filter(x => x !== n); } const baseArr = getProperFactors(n); // 生成多份真因数数组的拷贝(深拷贝避免引用问题) const arr = baseArr.map(() => [...baseArr]); return arr; } // 示例输出 admirable(6) // [ [1,2,3], [1,2,3], [1,2,3] ] admirable(12) // [ [1,2,3,4,6], [1,2,3,4,6], [1,2,3,4,6], [1,2,3,4,6], [1,2,3,4,6] ]
下一步处理需求
完成上述步骤后,我需要遍历每个子数组,将对应索引位置的元素取反,得到如下结果:
admirable(6) // [ [-1,2,3], [1,-2,3], [1,2,-3] ] admirable(12) // [ [-1,2,3,4,6], [1,-2,3,4,6], [1,2,-3,4,6], [1,2,3,-4,6], [1,2,3,4,-6] ]
待解决的最终问题
得到上述数组后,需要实现核心逻辑:
若n是赞赏数,返回需要取反的那个真因数,使得取反后的真因数之和等于n。
我初步想法是遍历每个子数组,对对应索引的元素逐一取反(比如arr[0][0] *= -1、arr[1][1] *= -1……),但昨天折腾了很久没理清完整逻辑,求可行的解决思路。
内容的提问来源于stack exchange,提问作者Nick Huemmer
相关产品推荐
相关产品推荐

