В сборниках занимательных математических задач встречается такой тип задач, когда надо из заданных чисел и арифметических знаков составить выражение, дающее какое-то заданное число. Пример такой задачи: "Составьте из чисел 4, 1, 8, 7 и арифметических знаков выражение, равное 24". Ответом может служить такое выражение: "(8-4) * (7-1)". К сожалению, некоторые авторы допускают ошибки и предлагают нерешаемую задачу, поэтому их начальник обратился к программистам.
Необходимо написать такую программу, которая определяет, можно ли построить из заданного набора выражение, равное числу N или нет. Так как это только прототип, то достаточно написать программу, которая работает только с наборами из 4-х чисел, а число N всегда равно 24.
Допустимые арифметические операторы: сложение, вычитание, умножение, деление, скобки.
На входе: массив из 4-х целых чисел от 1 до 9.
На выходе: true (если из заданного набора можно построить выражение, равное 24) или false (если из заданного набора такого выражения построить нельзя).
Пример 1.
На входе: [4, 1, 8, 7]
На выходе: true
Пояснение: (8-4) * (7-1) = 24
начал писать.... вроде как что-то да и получалось, но тут возник с подставлением скобок. и никак не могу придумать как правильно их ставить. ведь если она открывается или закрывается, то и расположение относительно арифм.знака меняется. вот код который получился, но не работает. подскажите как поступить. и можно ли как-то упростить эту гору циклов:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a, b, c, d;
char x, y, z, e, q, w;
a = 1;
b = 2;
c = 3;
d = 4;
int[] arr = new int[4];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
char[] charr = new char[6];
charr[0] = '+';
charr[1] = '-';
charr[2] = '/';
charr[3] = '*';
charr[4] = '(';
charr[5] = ')';
for (int i = 0; i < 4; i++) {
a = arr[i];
for (int j = 0; j < 4; j++) {
if (i != j) {
b = arr[j];
for (int k = 0; k < 4; k++) {
if (k != j & k != i) {
c = arr[k];
for (int l = 0; l < 4; l++) {
if (l != j & l != k & l != i) {
d = arr[l];
for (int m = 4; m < 5; m++) { // цикл символов
for (int n = 0; n < 6; n++) {
if (n != m ) {
for (int o = 0; o < 6; o++) {
if (o != n & o != m) {
for (int p = 0; p < 6; p++) {
if (p != o & p != n & p != m) {
for (int r = 0; r < 6; r++) {
if (r != m & r != n & r != o & r != p) {
for (int s = 0; s < 6; s++) {
if (s != m & s != n & s != o & s != p & s != r) {
System.out.println (charr[s] + a + charr[m] );
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}