繁体   English   中英

在数组中添加数字的所有组合

[英]Adding up all combinations of number in an array

我试图用javascript编写一个程序,从html textarea中获取一个未指定数量的数字并尝试所有组合(将所有数字相互添加)以查看它是否算出你指定的数字。

现在我可以在textarea中的字符串中创建一个数组,并使用for循环我添加它们(参见下面的代码)。 问题是如何为未加指定数量的数字添加(例如,如果在textarea中输入7个数字,则添加7个不同的数字)? 我正在考虑使用第二个数组,并将数字从第一个循环中加起来。 然后使用for循环使循环变量变长,其中包含所有数字(在我的示例中为行)的数组的长度作为endvalue。

如何填写第二个数组的值,确保使用所有组合?

顺便说一句,我想要这个代码因为我是审计员。 有时客户会在一次预订中反转几笔金额,而不做任何评论。 此代码将使检查哪些预订已被撤消变得更加容易

编辑:cheeken的awnen似乎工作我只有一个评论。 如果您的电源组的多个子集合累加,会导致您正在寻找的数字怎么办? 例如:findSum([1,2,3,4,5],6)可以得到[1,2,3],但[2,4]或[1,5]。 是否可以让函数返回多个子集?

找到答案我自己:)我替换代码

return numberSet;

通过

document.getElementById("outp").value=document.getElementById("outp").value+ numberSet +"\n"; 

非常感谢Cheeken

还有一个问题。 如何格式化输入以解析该函数​​? 下面的代码似乎不起作用。 inp是输入的textarea的ID(数字用半分隔。变量ge工作,所以没有问题(用[1,2,3,4]测试它并且它工作。有什么问题用这个代码?

重新编辑:

找到了解决方案。 需要将数组解析为浮动数字添加此代码

for (var i=0; i < lines.length; i++) {
    lines[i]= parseFloat(lines[i]);
    }


findSum(document.getElementById("inp").value.split(";"), ge);

码:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function powerset(arr) {
    var ps = [[]];
    for (var i=0; i < arr.length; i++) {
        for (var j = 0, len = ps.length; j < len; j++) {
            ps.push(ps[j].concat(arr[i]));
        }
    }
    return ps;
}

function sum(arr) {
    var total = 0;
    for (var i = 0; i < arr.length; i++)
        total += arr[i];
    return total
}

function findSum(numbers, targetSum) {
    var numberSets = powerset(numbers);
    for (var i=0; i < numberSets.length; i++) {
        var numberSet = numberSets[i]; 
        if (sum(numberSet) == targetSum)
            document.getElementById("outp").value=document.getElementById("outp").value+ numberSet +"\n"; 
    }
}

function main()
{

ge= document.getElementById("getal").value;
findSum([1,1,0.5,0.1,0.2,0.2], ge);


}


</script>
</head>
<body>

<input type="button" onclick="main()" value="tel" /><input type="text" id="getal" /><br>
input<br><textarea id="inp"  ></textarea><br>
output<br><textarea id="outp" ></textarea><br>
document.getElementById("inp").value.split(";")
</body>
</html>

更具体地说,您正在寻找您的数字集合的幂集中的每个集合的特定总和。

您可以使用以下代码完成此操作。

function powerset(arr) {
    var ps = [[]];
    for (var i=0; i < arr.length; i++) {
        for (var j = 0, len = ps.length; j < len; j++) {
            ps.push(ps[j].concat(arr[i]));
        }
    }
    return ps;
}

function sum(arr) {
    var total = 0;
    for (var i = 0; i < arr.length; i++)
        total += arr[i];
    return total
}

function findSum(numbers, targetSum) {
    var numberSets = powerset(numbers);
    for (var i=0; i < numberSets.length; i++) {
        var numberSet = numberSets[i]; 
        if (sum(numberSet) == targetSum)
            return numberSet;
    }
}

示例调用:

>> findSum([1,2,3,4,5],6)
[1, 2, 3]
>> findSum([1,2,3,4,5],0)
[]
>> findSum([1,2,3,4,5],11)
[1, 2, 3, 5]

如果您想收集其总和为值的所有子集(而不是第一个,如上所述),您可以使用以下方法。

function findSums(numbers, targetSum) {
    var sumSets = [];
    var numberSets = powerset(numbers);
    for (var i=0; i < numberSets.length; i++) {
        var numberSet = numberSets[i]; 
        if (sum(numberSet) == targetSum)
            sumSets.push(numberSet);
    }
    return sumSets;
}

示例调用:

>> findSums([1,2,3,4,5],5);
[[2,3],[1,4],[5]]
>> findSums([1,2,3,4,5],0);
[[]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM