ここから本文です

今回のみお願いしたいです。お礼500枚。 できれば今日の夜12:00までに javaの...

ren********さん

2015/4/1213:08:43

今回のみお願いしたいです。お礼500枚。
できれば今日の夜12:00までに

javaの課題を代行して頂きたいです。

4つの数値「1」「2」「3」「4」を使って計算し[10]となる計算方法を考えるとき
1+2+3+4や1*2*3+4などがあります
では、「1」「2」「3」「4」の4つの数値を使った計算で答えが10となるパターンはいくつあるでしょうか?
計算結果が10となる計算式を全て表示するプログラムを作成しなさい。
条件として下記があります。
・「1」「2」「3」「4」は全て1度ずつ使用すること。
・括弧を使用する計算式は除外すること。
例えば、(3-1)+4×2みたいなの
・使用する演算子は「+」「-」「×」「÷」のみとし、べき乗や余りを求める「%」は使用できない。
・「1+2+3+4」と「1+2+4+3」が登場してもOKとする。
javacでお願いします。
小町算ではないらしいです。
*、/が+、- の後ろにある場合は計算自体をやらない。
経験者でお優しい方今回のみ本当にお助けください・・

補足補足です
t_sakai1031さん最初に謝らせてください。すいませんでした

あまりにも初心者が書けないようなコードだと不正解とされてもっと簡単に書いてくれといわれます。
ですので優しい方々初心者でも書けるようなコードでお願いしたいです。
申し訳ないです。注文ばかりで・・

閲覧数:
170
回答数:
1
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

t_s********さん

2015/4/1213:24:59

間違ったのを出してくることはないと思います。

// test.java
import java.util.ArrayList;
import java.util.List;
import java.lang.Math;
import java.util.LinkedList;
import java.util.Stack;
import java.util.TreeSet;

class test{
public static void main(String[] args) {
Integer pop = null;
Stack<Integer> stack = new Stack<Integer>();
TreeSet<Integer> unused = new TreeSet<Integer>();
for (int i=1;i<=4;i++) unused.add((Integer)i);
stack.push(unused.pollFirst());
for(;;) {
if (null == pop) {
pop = unused.pollFirst();
if (null != pop) {
stack.push(pop);
pop = null;
} else {
pop = stack.pop();
unused.add(pop);
}
}
if (null != pop) {
pop = unused.higher(pop);
if (null != pop) {
unused.remove(pop);
stack.push(pop);
pop = null;
} else {
if (0==stack.size()) break;
pop = stack.pop();
unused.add(pop);
}
}
if (0 == unused.size()) {
operatorLoop(stack);
}
}
}

enum Operation {
ADD, SUBTRACT, MULTIPLY, DIVIDE
}
static final Operation[] operatorOrder = {Operation.ADD, Operation.SUBTRACT, Operation.MULTIPLY, Operation.DIVIDE};

static Operation operation(int caseNumber, int operationNumber) {
for (int i = 0;i<operationNumber;i++) {
caseNumber /= operatorOrder.length;
}
return operatorOrder[caseNumber%operatorOrder.length];
}
static void operatorLoop(List<Integer> operands) {
int cases;
LinkedList<Operation> opQueue = new LinkedList<Operation>();
LinkedList<Integer> numQueue = new LinkedList<Integer>();
Operation op;
cases = 1;
for (int i=0;i<operands.size()-1;i++) {
cases *= operatorOrder.length;
}
caseLoop: for (int caseNumber=0;caseNumber<cases;caseNumber++) {
opQueue.clear();
numQueue.clear();

numQueue.push(operands.get(0));
for (int opNumber=0;opNumber<operands.size()-1;opNumber++){
op = operation(caseNumber, opNumber);
switch (op) {
case ADD:
case SUBTRACT:
numQueue.push(operands.get(opNumber+1));
opQueue.push(op);
break;
case MULTIPLY:
if (0 != opQueue.size()) continue caseLoop;
numQueue.push(numQueue.pop()*operands.get(opNumber+1));
break;
case DIVIDE:
if (0 != opQueue.size()) continue caseLoop;
if (0 != numQueue.peekLast()%operands.get(opNumber+1)) {
continue caseLoop;
}
numQueue.push(numQueue.pop()/operands.get(opNumber+1));
break;
}
}
while (0 < opQueue.size()) {
op = opQueue.pollLast();
switch (op) {
case ADD:
numQueue.addLast(numQueue.pollLast()+numQueue.pollLast());
break;
case SUBTRACT:
numQueue.addLast(numQueue.pollLast()-numQueue.pollLast());
break;
}
}
if (10 == numQueue.pop()) {
System.out.print(operands.get(0));
for (int i=0;i<operands.size()-1;i++) {
op = operation(caseNumber, i);
switch (op) {
case ADD:
System.out.print("+");
break;
case SUBTRACT:
System.out.print("-");
break;
case MULTIPLY:
System.out.print("*");
break;
case DIVIDE:
System.out.print("/");
break;
}
System.out.print(operands.get(i+1));
}
System.out.println("");
}
}

}
}

  • 質問者

    ren********さん

    2015/4/1213:46:45

    ご回答ありがとうございます。
    ものすごくありがたいのですが
    もっと簡単に書ける方法ってあるのでしょうか?
    前にこのようなソースで出したら難しすぎるといわれて不正解にされてしまって・・
    注文ばかりで申し訳ないのですがお願いしても大丈夫でしょうか?
    本当に注文ばかりすいません

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2015/4/13 18:05:45

t_sakai1031様
今回まだ正解は頂いてはいないのですが昨日からこの問題と自分の知識のなさにお付き合いいただいたのでBAさせていただきます。
本当にありがとうございました

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる