Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/48: Рейтинг темы: голосов - 48, средняя оценка - 4.56
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59

Можно ли построить из заданного набора выражение, равное числу N

27.03.2019, 22:15. Показов 11797. Ответов 127

Студворк — интернет-сервис помощи студентам
В сборниках занимательных математических задач встречается такой тип задач, когда надо из заданных чисел и арифметических знаков составить выражение, дающее какое-то заданное число. Пример такой задачи: "Составьте из чисел 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







начал писать.... вроде как что-то да и получалось, но тут возник с подставлением скобок. и никак не могу придумать как правильно их ставить. ведь если она открывается или закрывается, то и расположение относительно арифм.знака меняется. вот код который получился, но не работает. подскажите как поступить. и можно ли как-то упростить эту гору циклов:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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]  );
 
 
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
 
 
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2019, 22:15
Ответы с готовыми решениями:

Проверить можно ли указанные слова составить из заданного набора букв
Добрый день! Помогите с заданием. Дана строка произвольных букв. Далее мы вводим 5 слов. Необходимо чтобы программа сопоставила буквы из...

Проверить, можно ли из заданного набора букв составить заданное слово
помогите пожалуйста составить программу, не знаю с чего начать. Двумерный массив n x m содержит некоторые буквы алфавита, ...

Определить, сколько прямоугольных треугольников можно создать из заданного набора точек
Помогите решить задачу. Дано множество точек на плоскости. Определить, сколько прямоугольных треугольников можно создать из этого...

127
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
01.04.2019, 21:42
Студворк — интернет-сервис помощи студентам
так сравнивай 2 double

if ((double) 24 == result) //то хорошо
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
01.04.2019, 21:45
Object result = engine.eval("(3/7+3)*7");
result.equals(24);//false
result.equals((float) 24);//false
Почему так?

Добавлено через 35 секунд
LektorIn, спасибо.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
01.04.2019, 21:50
Лучше с кастуй к типу Number:

Java
1
2
3
4
        Object number = 24.0;
        Number num = (Number) number;
        
        System.out.println(num.doubleValue() или num.intValue() или ещё какой тип);
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
01.04.2019, 21:51
Цитата Сообщение от Timoved Посмотреть сообщение
Почему так?
ответ дали ниже.. я вообще не вижу смысла в таких сравнениях и такой "точности" .. по моему на прошлой странице я подробно описал проблему "недоразумение" с этим заданием .. пока ты не знаешь с какой точностью работать,в какую сторону с какого знака после запятой округлять- ловить в этом задании нечего ,к сожалению .. проверено на Double,int,-эти варианты точно не катят. с чистым BigDecimal и точностью до 17 знаков после запятой так же не катит-точность там нужна меньше, насколько меньше-неизвестно. в общем это задание уже попахивает как кислая капуста которая на солнышке двое суток провела в закрытой банке .
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
01.04.2019, 21:51
потому что у Object метод equals работает просто сравнивая 2 ссылки, а не значения
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
01.04.2019, 21:53
Цитата Сообщение от LektorIn Посмотреть сообщение
Object o = "24.0";//как у тебя *в примере
* * * * String r = o.toString();
* * * * r = r.substring(0, 2);
Java
1
2
3
4
5
6
        public static final double EPS = 0.0000001;
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
        String foo = "40+2";
        Object eval = engine.eval(foo);
        boolean equal = eval instanceof Number && ((Number) eval).doubleValue() - 42 < EPS;
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
01.04.2019, 22:21
Был такой цикл:
Java
1
2
3
4
5
6
7
8
for (int p = 0; p < 7; p++) {
    result = engine.eval(arrStr[p]);
    if (result.equals(NUMBER_N)) {
        explanation = "Пояснение: " + arrStr[p] + "=24";
        isEqualTo24 = true;
        break;
    }
}
Стал такой:
Java
1
2
3
4
5
6
7
8
9
    for (int p = 0; p < 7; p++) {
        result = Float.valueOf(engine.eval(arrStr[p]).toString());
 
        if (result.equals(Float.valueOf(NUMBER_N))) {
            explanation = "Пояснение: " + arrStr[p] + "=24";
            isEqualTo24 = true;
            break;
        }
    }
Добавлено через 35 секунд
NUMBER_N - это число 24.

Добавлено через 51 секунду
Ну, и тип result был изменен с Object на float.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
01.04.2019, 22:29
Цитата Сообщение от Timoved Посмотреть сообщение
Float.valueOf(engine.eval(arrStr[p]).toString())
ты сам то понимаешь зачем это все делаешь?
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
02.04.2019, 09:51
xoraxax, нужно преобразовать к вещественному типу. Возможно, я иду по долгому пути. Сначала преобразуются к строке, а потом к типу float. Скорее всего, можно преобразовать сразу к типу float. А потом уже сравниваю два числа: одно вещественное, которое, возможно, криво преобразовал, а другое - число 24, преобразованное в вещественное.
0
0 / 0 / 0
Регистрация: 02.04.2019
Сообщений: 9
02.04.2019, 16:27
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
public class Laba6 {
    public static boolean canBeEqualTo24(int[] nums) {
        if (nums.length < 4) return false;
        final int RESULT = 24;
        if (nums[0] + nums[1] + nums[2] + nums[3] == RESULT) return true;
        if (nums[0] * nums[1] * nums[2] * nums[3] == RESULT) return true;
 
        int[][] shuffle = {
                {0, 1, 2, 3},
                {0, 1, 3, 2},
                {0, 2, 1, 3},
                {0, 2, 3, 1},
                {0, 3, 2, 1},
                {0, 3, 1, 2},
 
                {1, 0, 2, 3},
                {1, 0, 3, 2},
                {1, 2, 0, 3},
                {1, 2, 3, 0},
                {1, 3, 2, 0},
                {1, 3, 0, 2},
 
                {2, 0, 1, 3},
                {2, 0, 3, 1},
                {2, 1, 0, 3},
                {2, 1, 3, 0},
                {2, 3, 0, 1},
                {2, 3, 1, 0},
 
                {3, 0, 1, 2},
                {3, 0, 2, 1},
                {3, 1, 0, 2},
                {3, 1, 2, 0},
                {3, 2, 0, 1},
                {3, 2, 1, 0},
 
 
        };
        for (int i = 0; i < 24; i++) {
            int a = nums[shuffle[i][0]];
            int b = nums[shuffle[i][1]];
            int c = nums[shuffle[i][2]];
            int d = nums[shuffle[i][3]];
 
            if (a * b - c  == RESULT) return true;
            if (a * b + c  == RESULT) return true;
 
            if (a + b + c - d == RESULT) return true;
            if (a + b + c * d == RESULT) return true;
            if (a + b * c * d == RESULT) return true;
            if (a * b * c - d == RESULT) return true;
            if (a + b * c - d == RESULT) return true;
            if (a - b - c + d == RESULT) return true;
            if (a - b - c * d == RESULT) return true;
            if (a + b - c - d == RESULT) return true;
 
            if (-a + b + c - d == RESULT) return true;
            if (-a + b + c * d == RESULT) return true;
            if (-a + b * c * d == RESULT) return true;
            if (-a * b * c - d == RESULT) return true;
            if (-a + b * c - d == RESULT) return true;
            if (-a - b - c + d == RESULT) return true;
            if (-a - b - c * d == RESULT) return true;
            if (-a + b - c - d == RESULT) return true;
 
            if (a + (b * c * d) == RESULT) return true;
            if (a * (b * c - d) == RESULT) return true;
            if (a * -(b * c - d) == RESULT) return true;
            if ((a + b + c) * d == RESULT) return true;
            if ((a - b - c) * d == RESULT) return true;
            if ((a - b + c) * d == RESULT) return true;
 
            if ((-a - b - c) * d == RESULT) return true;
            if ((-a - b + c) * d == RESULT) return true;
            if (-(a - b - c) * d == RESULT) return true;
            if (-(a - b + c) * d == RESULT) return true;
            if (d != 0) {
                if (a + b + c / d == RESULT) return true;
                if (a * b * c / d == RESULT) return true;
                if (a + b - c / d == RESULT) return true;
                if (a * b + c / d == RESULT) return true;
                if (a * b - c / d == RESULT) return true;
                if (a - b - c / d == RESULT) return true;
 
                if (-a + b + c / d == RESULT) return true;
                if (-a * b * c / d == RESULT) return true;
                if (-a + b - c / d == RESULT) return true;
                if (-a * b + c / d == RESULT) return true;
                if (-a * b - c / d == RESULT) return true;
                if (-a - b - c / d == RESULT) return true;
 
                if ((a + b + c) / d == RESULT) return true;
                if ((a - b - c) / d == RESULT) return true;
                if ((a + b - c) / d == RESULT) return true;
 
                if ((-a + b + c) / d == RESULT) return true;
                if ((-a - b - c) / d == RESULT) return true;
                if ((-a + b - c) / d == RESULT) return true;
 
                if (-(a - b - c) / d == RESULT) return true;
                if (-(a + b - c) / d == RESULT) return true;
            }
            if (d != 0 && c != 0) {
                if (a + b / c / d == RESULT) return true;
                if (a * b / c / d == RESULT) return true;
                if (a - b / c / d == RESULT) return true;
 
 
               
            }
 
        }
 
 
        return false;
    }
 
    public static void main(String[] args) {
        int[] array = {3, 7, 3, 7};
 
        System.out.println(canBeEqualTo24(array));
 
    }
}
Я как ещё один соискатель отправил вот эту дичь
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
02.04.2019, 16:29
Цитата Сообщение от Dmitry_Barynov Посмотреть сообщение
вот эту дичь
зато легко читаемый код))
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
02.04.2019, 16:40
Dmitry_Barynov, а пояснение пишет? Ну, хотя бы одну комбинации, которая даёт число 24.
0
0 / 0 / 0
Регистрация: 02.04.2019
Сообщений: 9
02.04.2019, 16:53
а зачем не было этого в задании
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
02.04.2019, 16:57
Цитата Сообщение от Dmitry_Barynov Посмотреть сообщение
а зачем не было этого в задании
ну во первых в задании было(нужно подумать как это реализовать),во вторых интересен ответ фирмы на ваш код..
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
02.04.2019, 17:03
В задании это было. Я отправлял полнуб копию задания. К сожалению, мой код медленно работает, хоть и работает верно. Со второй попытки. Это говорит о том, что будет предложено его оптимизировать. Слегка оптимизировать - это понятно. Но сильно увеличить производительность пока не знаю как.

Добавлено через 54 секунды
LektorIn, спасибо за помощь и подсказки, в том числе и разжевывание некоторых моментов.
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
02.04.2019, 17:08
Цитата Сообщение от Timoved Посмотреть сообщение
работает верно
тебе уже отписали что он работает верно?
0
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
02.04.2019, 17:13  [ТС]
Timoved, да я многое пропустил :-) тоже завернули с округлением. но я сделал вот так:
(result.equals(24.0) || result.equals(24))
0
0 / 0 / 0
Регистрация: 02.04.2019
Сообщений: 9
02.04.2019, 17:17
LektorIn,

Представьте ваше решение в виде java-функции вида:
public boolean canBeEqualTo24(int[] nums) {
...
}
там и main не должно было быть

кстати у меня много ошибок в том примере что я выложил но так как я отправлял не файлом а ссылкой на гитхаб поправил сразу же(например нет проверки остатка от деления что нужно)
когда получу ответ о фирмы отпишусь
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
02.04.2019, 17:27
wolfbethowen, маякни когда фирма отпишет что код по их мнению полностью рабочий
Цитата Сообщение от Dmitry_Barynov Посмотреть сообщение
там и main не должно было быть
-оно то да,вот только откуда взяться строке с примером?
0
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
02.04.2019, 17:53  [ТС]
LektorIn, да, конечно. часто бываешь здесь? а то у меня частенько интересные задачи возникают) кстати, сейчас тоже есть одна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2019, 17:53

Сколькими способами гирями заданного набора можно составить вес в v грамм
Имеются 10 гирь весом 100, 200, 300, 500, 1000, 1200, 1400, 1400, 1500, 2000 и 2000г. Сколькими способами гирями этого набора можно...

Пирамиду какой наибольшей высоты можно построить из набора блоков
Замечание В приведенном примере пирамида будет состоять из двух блоков: нижним будет блок с номером 3, а верхним – блок с номером 2. Блок...

Сколькими способами гирями заданного набора весов можно составить вес в v грамм?
Имеются 10 гирь весом 100, 200, 300, 500, 1000, 1200, 1400, 1500, 2000, 3000 г. Сколькими способами гирями этого набора можно составить вес...

Строки. Напечатать все пары символов, которые можно из заданного набора составить
Пусть имеется набор символов ai, a2,.....,an. Составить программу, которая позволит напечатать все пары символов, которые можно из этого...

Указать минимальное количество первых букв, по которым можно различить слова из заданного набора
Указать минимальное количество первых букв, по которым можно различить слова из заданного набора(слова разделены пробелами) Вообщем,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru