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

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

27.03.2019, 22:15. Показов 12013. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru