質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1765閲覧

for文による四則演算

stzyang

総合スコア6

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/12/12 11:52

編集2020/12/12 13:06

前提・実現したいこと

始めに4桁の数字を入力してもらい、その後合計値にしたい数字を入力、入力された数値になるように初めに入力された数字を四則演算し、合計値になる式を見つけたらリストに追加し、すべてのパターンで検証したのちに答えに合致する式をすべて表示するプログラムを作っています
4つの数字を四則演算する際に、下記のコードのようなすべての計算を各プログラムではコードが見づらくわかりにくくなると感じ、for文でできる限り短いコードを作ろうと考えているのですが、乗算だけの繰り返しや、加算だけの繰り返しの記事を見つけることはできたものの、四則演算すべての繰り返しを見つけることができませんでした。
forによる繰り返しで四則演算すべてを行うのは難しいでしょうか?
また、for以外により分かりやすくきれいなコードになるやり方があれば教えていただけると幸いです

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Java

1import java.util.ArrayList; 2import java.util.InputMismatchException; 3import java.util.List; 4import java.util.NoSuchElementException; 5import java.util.Scanner; 6public class Main { 7 public static void main (String[]args) throws Exception{ 8 //数字を抜き取り、それぞれの数字を入れ替え、計算処理を施し、次に指定する数になるか調べる 9 int number; 10 System.out.println("4桁の数字を入力してください"); 11 while(true) { 12 try { 13 number = new Scanner(System.in).nextInt(); 14 String str = String.valueOf(number); 15 if(str.length()!=4) { 16 throw new InputMismatchException (); 17 } 18 break; 19 } catch (InputMismatchException e) {} 20 catch (NoSuchElementException e) {} 21 } 22 23 int totalNumber; 24 System.out.println("合計値にしたい数字を入力してください"); 25 while(true) { 26 try { 27 28 totalNumber = new Scanner(System.in).nextInt(); 29 break; 30 } catch (InputMismatchException e) {} 31 catch (NoSuchElementException e) {} 32 } 33 34 String str = String.valueOf(totalNumber); 35 System.out.println(Calculation(str,number)); 36 } 37 38 private static String Calculation(String totalNumber,int number) { 39 List<String> numberList = new ArrayList<String>(); 40 List<StringBuilder> formulaList = new ArrayList<StringBuilder>(); 41 StringBuilder sb = new StringBuilder(); 42 43 for(int i = 0;i< String.valueOf(number).length();i++){ 44 numberList.add(String.valueOf(number).substring(i,i+1)); 45 } 46 int num1 = Integer.parseInt(numberList.get(0)); 47 int num2 = Integer.parseInt(numberList.get(1)); 48 int num3 = Integer.parseInt(numberList.get(2)); 49 int num4 = Integer.parseInt(numberList.get(3)); 50 51 //ここで四則演算 52 if(num1+num2+num3+num4==number) { 53 sb.append(num1); 54 sb.append("+"); 55 sb.append(num2); 56 sb.append("+"); 57 sb.append(num3); 58 sb.append("+"); 59 sb.append(num4); 60 formulaList.add(sb); 61 } 62 if(num1+num2+num3-num4==number) { 63 sb.append(num1); 64 sb.append("+"); 65 sb.append(num2); 66 sb.append("+"); 67 sb.append(num3); 68 sb.append("-"); 69 sb.append(num4); 70 formulaList.add(sb); } 71 //以下同じ処理をすべての四則演算で行う 72 73 74 return formulaList.toString(); 75 }

試したこと

もう一つListを作り、中に"+-*/"を入れ、for文で活用しようとしたものの文字列としてしか利用できませんでした(計算に使えるやり方を調べたものの把握できませんでした)

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2020/12/12 16:32 編集

4つの数字の入れ替えは考えなくていいのですか? 四則演算で、乗除算は加減算より先にするんですか? それとも左から順番に? 括弧は無いんですよね。 ところで、質問のコードでは、入力した totalNumber は使っていませんね。
stzyang

2020/12/13 03:45

4つの数字の入れ替えや、分数を考慮した計算等は、順番通りの数字による計算ができるようになってからと、考えていました。括弧に関しては考えておりませんでした。ご指摘ありがとうございます。いろいろなことを考慮していけるよう精進したします。 四則演算のロジックを優先して作成していたためtotalNumberによる計算値との比較を後回しにしていました。
guest

回答1

0

ベストアンサー

forによる繰り返しで四則演算すべてを行うのは難しいでしょうか?

+、-、*、/ を 0、1、2、3 に置き換えるとできますよ。

Java

1import java.util.Scanner; 2 3class Main { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 System.out.println("4桁の数字を入力してください"); 7 String number = sc.next(); 8 int[] num = new int[4]; 9 for (int i = 0; i < 4; i++) num[i] = number.charAt(i) - '0'; 10 System.out.println("計算値にしたい数字を入力してください"); 11 int result = sc.nextInt(); 12 int[] op = new int[4]; 13 for (op[0] = 0; op[0] < 4; op[0]++) 14 for (op[1] = 0; op[1] < 4; op[1]++) 15 for (op[2] = 0; op[2] < 4; op[2]++) 16 if (calc(num, op) == result) 17 print(num, op, result); 18 } 19 20 private static void print(int[] num, int[] op, int result) { 21 final String[] name = { "+", "-", "*", "/" }; 22 System.out.println(num[0] + name[op[0]] + num[1] 23 + name[op[1]] + num[2] + name[op[2]] + num[3] + " = " + result); 24 } 25 26 private static int calc(int[] num, int[] op) { 27 int a = num[0]; 28 for (int i = 0; i < 3; i++) 29 switch (op[i]) { 30 case 0: a += num[i+1]; break; 31 case 1: a -= num[i+1]; break; 32 case 2: a *= num[i+1]; break; 33 case 3: a = (num[i+1] != 0) ? a / num[i+1] : 999999999; 34 } 35 return a; 36 } 37}

実行例

text

14桁の数字を入力してください 21234 3計算値にしたい数字を入力してください 45 51+2*3-4 = 5 61+2/3+4 = 5

演算は左から順に実行。
割り算は整数の除算(小数点以下切り捨て)。

追記
ビット演算を使うと、 forの三重ループがひとつの for文になります。

Java

1 for (int i = 0; i < 1<<6; i++) { 2 int[] op = { i>>4 & 3, i >>2 & 3, i & 3 }; 3 if (calc(num, op) == result) print(num, op, result); 4 }

あるいは、 forの三重ループのところで計算をすると、計算回数が減らせます。

Java

1 for (op[0] = 0; op[0] < 4; op[0]++) { 2 int a = calc(num[0], op[0], num[1]); 3 for (op[1] = 0; op[1] < 4; op[1]++) { 4 int b = calc(a, op[1], num[2]); 5 for (op[2] = 0; op[2] < 4; op[2]++) 6 if (calc(b, op[2], num[3]) == result) 7 print(num, op, result); 8 } 9 } 10 11 private static int calc(int a, int op, int b) { 12 switch (op) { 13 case 0: return a + b; 14 case 1: return a - b; 15 case 2: return a * b; 16 case 3: if (b != 0) return a / b; 17 } 18 return 999999999; 19 }

switch文を使わないやり方も考えられます。

Java

1import java.util.Scanner; 2 3class Main { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 System.out.println("4桁の数字を入力してください"); 7 String number = sc.next(); 8 int[] num = new int[4]; 9 for (int i = 0; i < 4; i++) num[i] = number.charAt(i) - '0'; 10 System.out.println("計算値にしたい数字を入力してください"); 11 int result = sc.nextInt(); 12 int[] op = new int[4]; 13 Calc[] calc = { new Add(), new Sub(), new Mul(), new Div() }; 14 for (op[0] = 0; op[0] < 4; op[0]++) { 15 int a = calc[op[0]].exec(num[0], num[1]); 16 for (op[1] = 0; op[1] < 4; op[1]++) { 17 int b = calc[op[1]].exec(a, num[2]); 18 for (op[2] = 0; op[2] < 4; op[2]++) 19 if (calc[op[2]].exec(b, num[3]) == result) 20 print(num, op, result); 21 } 22 } 23 } 24 25 private static void print(int[] num, int[] op, int result) { 26 final String[] name = { "+", "-", "*", "/" }; 27 System.out.println(num[0] + name[op[0]] + num[1] 28 + name[op[1]] + num[2] + name[op[2]] + num[3] + " = " + result); 29 } 30} 31 32class Calc { int exec(int a, int b) { return 0; } } 33class Add extends Calc { int exec(int a, int b) { return a + b; } } 34class Sub extends Calc { int exec(int a, int b) { return a - b; } } 35class Mul extends Calc { int exec(int a, int b) { return a * b; } } 36class Div extends Calc { 37 int exec(int a, int b) { return b != 0 ? a / b : 999999999; } 38}

投稿2020/12/12 17:35

編集2020/12/13 06:13
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stzyang

2020/12/13 03:55

実行例まで誠にありがとうございます。 コードを参考にしながら順不同な場合やご指摘の括弧を利用する場合も考えていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問