-2

質問

数字の文字列を考えてみましょう123456789+文字列内に配置または-散在させることによって形成できるすべての算術式を考慮してください。例:

1 + 2 - 345 + 67 - 8 - 9 = 292
123456 - 789 = 122667

スタックを使用して value を持つ組み合わせを見つける Java プログラムを作成します2012

私の問題

2 つの算術演算子を使用する必要があるため、ロジックに行き詰まっています。

import java.util.*;

public class arithmeticStack {
    public static void main (String args[]) {
        ArrayList<String> dg = new ArrayList<String>();
        Stack<String> digits = new Stack<String>();
        int number = 0;
        dg.add("1");
        dg.add("2");
        dg.add("3");
        dg.add("4");
        dg.add("5");
        dg.add("6");
        dg.add("7");
        dg.add("8");
        dg.add("9");

        for (int i = 0; i <= dg.size() - 1; i++) {
            digits.push(dg.get(i));
        }

        for (String f : digits){
            number += Integer.parseInt(f);
        }

        while (number == 2012) {
        }                                     
    }
}
4

3 に答える 3

2

したがって、このクラス内にコードを追加するだけで、sum == 2012 をチェックできます。

PS 良い演習をありがとう、私は私の学生のためにそれを使用します.

PPS Ups、申し訳ありませんが、ここで 1 つの間違いを修正しました。このコードは、任意の数の操作で機能します。「ops」変数でそれらを列挙し、計算合計の特定のコードを追加するだけです。

import java.util.Stack;

public class Arithmetics {

public static void main(String[] args) {
    String digits = "1234567890";
    //String ops = "+-*";
    String ops = "+-";

    String number = "";
    Stack<String> numbers = new Stack<>();
    for (int i = 0; i < 2 << digits.length(); i += 2) {
        number = "" + digits.charAt(0);
        for (int bit = 0; bit < digits.length() - 1; bit++) {
            int j = (2 << bit) & i;
            if (j > 0) {
                numbers.push(number);
                number = "";
            }
            number += digits.charAt(bit + 1);
        }
        numbers.push(number);

        for (String n : numbers) {
            System.out.print(n + " ");
        }
        System.out.println();

        String expression = "";
        Integer sum = 0;
        final int base = ops.length();
        for (int k = 0; k < Math.pow(base, numbers.size() - 1); k++) {
            expression = numbers.get(0);
            sum = Integer.parseInt(expression);
            for (int pos = 0; pos < numbers.size() - 1; pos++) {
                int opNum = k;
                for (int j = numbers.size() - 1; j >= pos + 1; j--) {
                    if (opNum >= Math.pow(base, j)) {
                        opNum = (int) (opNum - (opNum / (int)Math.pow(base, j)) * (int)Math.pow(base, j));
                    }
                }
                if (pos > 0) {
                    opNum = (int) (opNum - Math.pow(base, (pos - 1)));
                    opNum = (int) (opNum / Math.pow(base, pos));
                }
                expression += ops.charAt(opNum);
                // -------------------------------
                if (ops.charAt(opNum) == '+') {
                    sum += Integer.parseInt(numbers.get(pos + 1));
                } else
                if (ops.charAt(opNum) == '-') {
                    sum -= Integer.parseInt(numbers.get(pos + 1));
                } /*else
                if (ops.charAt(opNum) == '*') {
                    sum *= Integer.parseInt(numbers.get(pos + 1));
                }*/
                // -------------------------------
                expression += numbers.get(pos + 1);
            }
            System.out.println(expression + " = " + sum);
        }

        numbers.clear();
    }

}

}
于 2012-10-25T08:00:43.463 に答える
1

必要な組み合わせが見つかりました

1234 - 5 - 6 +789  = 2012 

しかし、あなたは論理的にそれに到達しなければなりません。

スタックに押し込みながら組み合わせを試して(値と+または-)、すべてポップしない場合の答えが2012かどうかを確認します。組み合わせが 2012 になるまでプッシュ アンド ポップします。スタック アイテムには組み合わせが下から上に含まれます。

   String [] numbers = {"1","2","3","4","5","6","7","8","9"};

   String [] operators ={"+","-"};

演算子配列を使用してスタックにプッシュできます

于 2012-10-25T07:43:45.297 に答える
0

大まかな考え、これは私が考えることができるものです:

数字の間にあると考えてください。数字は。8 empty boxesで埋めることができます+,- or nothing3^8 = 6561したがって、さまざまな順列を取得できます。8文字の配列を作成します。今、この配列を並べ替えて、そのすべての可能性を見つけてください。申し訳ありませんが、今これを行う方法がわかりません。誰か他の人があなたに説明できるかもしれません。これらの順列を使用して、これらの値を元の文字列に挿入します。

スタックを使用して式を評価できます。おおまかに次のように、演算子の優先順位を考慮せずに実行できます。

左から右に繰り返し、オペランドが見つかった場合は、それをスタックにプッシュします。オペレーターに遭遇した場合は、それをスタックに再度プッシュします。ここで、2番目のオペランドを入力したら、演算子をポップして取得し、もう一度ポップしてオペランドを取得し、これら2つのオペランドと演算子を使用して操作を実行し、結果をスタックにプッシュします。最終的に、結果はスタックにあります。

編集:またはPythonのeval...を使用してください

于 2012-10-25T07:22:35.827 に答える