如何通过特定的数字和将一个数字分解为不同组合

5

这个变量 x 包含一个需要与数组进行比较的数字。 var x = 10; var ary = [ 3,5 ]

我想测试是否可以用 ary 中的任意一组数之和来组成 x,然后显示哪些数相加得到了 x

在这种情况下,无法使用 3。如果 x = 10,结果应该是 5, 5(因为函数应该搜索数组并找到 5 + 5 等于 10)

数组的长度和 x 是未知的。我没有使用任何库。到目前为止我已经做到了:

var x = 10;
var ary = [ 3, 5 ];

function cycle(){
  var result;
  for( var i = 0; i < ary.length; i++ ){
    if( ary[ i ] + ary[ i ] == x ){
       result = ary[ i ] + ',' + ary[ i ];
    }
    else if( ary[ i ] + ary[ i + 1 ] == x ){
      result = ary[ i ] + ',' + ary[ i + 1 ];
    }
    else if( ary[ i + 1 ] + ary[ i + 1 ] == x ){
      result = ary[ i + 1 ] + ',' + ary[ i + 1 ];
  }
  return result;
  }
}
  

var result = cycle();
document.write( result );

我知道上面的代码很糟糕,在灵活性方面不够,只适用于我使用它的特定情况。如何包含所有可能的组合?
假设数组仍然只有值为35的2个元素,以下是更多示例,根据x得到的结果:
如果x=8,则结果将为3, 5
如果x=15,则结果将为5, 5, 5
如果x=9,则结果将为3, 3, 3等。 注意:键可以使用的次数没有限制。

@guest271314 的目标是检查任何总和是否等于 x。包括将索引自身添加多次以达到 x,或将其添加到任何其他索引加上自身以达到 x。 - user6597020
1
数的分割算法可以帮助你。https://dev59.com/MnRC5IYBdhLWcg3wJNcN - Pardeep Dhingra
@PardeepDhingra 谢谢。这个例子没有将分区数量限制为数组键的数量,但我会尝试看看它是否能帮助我想出任何东西。 - user6597020
@GeorgeJempty,我认为将链接的问题视为当前问题的重复,因为OP已经付出了努力来解决自己的问题。 - guest271314
@GeorgeJempty,"more" 的内在价值是什么?另外,顺带一提,链接的问题没有标记为 javascriptarrays,当前问题也没有标记为 algorithmcombinations - guest271314
显示剩余2条评论
1个回答

2

您可以使用乘法。创建一个数组,其.length等于输入数组ary中最大的数字加上1,将数组的索引乘以当前数字,如果乘积等于目标数字,则创建一个具有.length等于index的数组,并用ary的当前元素填充该数组,否则将返回数组的结果索引设置为输入数字。

const x = [8, 9, 10, 15];
let ary = [3, 5];

let nums = (n, arr) => {
  let [keys, res] = [
    Array.from(Array(Math.max.apply(Math, arr) + 1).keys()).splice(1)
    , Array()
  ];
  for (let prop of arr) {
    for (let index of keys) {
      if (prop * index <= n) {
        if (prop * index === n) {
          res.push(Array(index).fill(prop)); break;
        }
      } else {
        res.push(prop); break;
      }
    }
  }
  return {x:n, result:res};
}

for (let num of x) console.log(nums(num, ary));


谢谢你的回答。这比我原先做的要好得多。唯一的问题是,当我不断改变 x 的值时,函数与我所期望的结果不一致。例如,当 x = 15 时,结果为 5, 5,而期望的是 5, 5, 5。我会研究一下并尝试调整它。谢谢。 - user6597020

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接