1

HTMLテキストエリアから不特定の数の数字を取得し、すべての組み合わせ(すべての数字を互いに追加)を試みて、指定した数字と一致するかどうかを確認するプログラムをjavascriptで作成しようとしています。

これで、テキストエリア内の文字列から配列を作成し、forループを使用してこれらを追加できます (以下のコードを参照)。問題は、加算される未指定の数に対してこれを行うにはどうすればよいですか (たとえば、テキストエリアに 7 つの数字を入力した場合、7 つの異なる数字を加算するなど)? 最初のループから合計する数値を取得する 2 番目の配列を使用することを考えていました。そして、すべての数値 (私の例では行) を endvalue として含む配列の長さを持つ for ループを使用して、ループ変数の長さを作成します。

すべての組み合わせが使用されていることを確認して、この 2 番目の配列の値を入力するにはどうすればよいですか?

ところで、私は監査人なので、このコードが欲しかったのです。クライアントは、コメントなしで、1 回の予約でいくつかの金額を取り消すことがあります。このコードにより、どの予約が取り消されたかを簡単に確認できます

編集:チーケンのアンサーは機能しているようです。コメントは1つだけです。パワーセットの複数のサブセットを合計すると、探している数になる場合はどうなりますか? 例: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"; 

ありがとうございます!

もう 1 つ追加の質問です。その関数を解析するために入力をフォーマットするにはどうすればよいですか? 以下のコードは機能していないようです。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>
4

1 に答える 1

9

より具体的には、数値のコレクションの累乗セット内の各セットの特定の合計を探しています。

これは、次のコードで実現できます。

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);
[[]]
于 2012-08-18T16:07:44.923 に答える