我正在尝试用 javascript 编写一个程序,该程序从 html textarea 中获取未指定数量的数字,并尝试所有组合(将所有数字彼此相加)以查看它是否与您指定的数字相匹配。
现在我可以用 textarea 中的字符串创建一个数组,并使用for
循环将它们添加起来(见下面的代码)。问题是如何为未指定数量的要相加的数字执行此操作(例如,如果您在 textarea 中输入 7 个数字,则相加 7 个不同的数字)?我正在考虑使用第二个数组,它会从第一个循环中获取要加起来的数字。然后通过使用包含所有数字(在我的示例中为行)作为最终值的数组的长度的 for 循环来制作循环变量的长度。
如何填写第二个数组的值,确保使用所有组合?
顺便说一句,我想要这段代码,因为我是一名审计员。有时,客户在一次预订中撤销了几个金额,而没有任何评论。此代码将更容易检查哪些预订已被撤销
编辑:cheheen 的遮阳篷似乎在工作我只有一句话。如果您的电源组的多个子组相加会产生您正在寻找的数字怎么办?例如: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";
非常感谢奇肯
还有一个问题。如何格式化输入以解析该函数?下面的代码似乎不起作用。inp 是输入所在的文本区域的 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>