You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历同构数组集并逐一取反对应元素?附赞赏数求解需求

赞赏数(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:20:19