将数组中的所有数字组合相加
Adding up all combinations of number in an array
我正在尝试用javascript编写一个程序,该程序从html文本区域中获取未指定数量的数字,并尝试所有组合(将所有数字相互相加)以查看它是否计算出您指定的数字。
现在我可以从文本区域中的字符串中创建一个数组,并使用for
循环将它们相加(见下面的代码)。问题是,对于要相加的未指定数量的数字,您如何执行此操作(例如,如果您在文本区域中输入 7 个数字,则相加 7 个不同的数字)?我正在考虑使用第二个数组,它将数字从第一个循环中相加。然后通过使用 for 循环来制作循环变量的长度,其中包含所有数字(在我的示例中为行)的数组长度作为结束值。
如何填写第二个数组的值,确保使用所有组合?
顺便说一下,我想要这个代码,因为我是一名审计员。有时,客户在一次预订中撤销了几笔金额,没有任何评论。此代码将使检查哪些预订已撤销变得更加容易
编辑:Cheeken的遮阳篷似乎正在工作,我只有一句话。如果电源组的多个子集加起来会产生您正在寻找的数字怎么办?例如: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>
更具体地说,您正在数字集合的幂集中查找每个集合的特定总和。
您可以使用以下代码完成此操作。
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);
[[]]
- 如何在谷歌可视化中组合数字和模式格式化程序
- 将数组中的所有数字组合相加
- 获取对象的所有可能组合,其中值的总和与数字匹配
- 给定一个4位锁,其中每个数字可以是0、1、2、3或4,我如何计算所有加起来为4的组合
- Javascript给定了一个数字,我想要所有可能的组合和元素数组
- 显示给定输入数字的数据集中字母表的所有可能组合
- 当前面的数字或前面字符的组合未知时提取字符串
- 与数字组合的唯一性,与顺序无关
- 从组合框中获取值并向其添加一个数字
- 将 2 个数字组合起来用作对象键的有效方法是什么
- Captcha IMG/数字组合
- 对具有字母和数字组合的数据进行排序,该数据在javascript中的json数组中具有值
- 具有唯一结果的两个数字组合的精简算法
- 用于字母/数字组合的正则表达式
- Knockout:为数字组合2个自定义绑定-金融数据
- JavaScript Tic Tac Toe -查找数组中所有可能的数字组合
- 试图将随机化的数字组合起来
- 将n个数字组合成两个唯一的组
- Javascript - 排序字母数字组合
- 字母和数字组合与正则表达式匹配