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

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

27.03.2019, 22:15. Показов 11736. Ответов 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
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
30.03.2019, 21:18  [ТС]
Студворк — интернет-сервис помощи студентам
LektorIn, а ражна меня все время на другую страницу перебрасывало? два дня мучаюсь, бред какой-то...
Примечание: убедитесь, что в вашем решении деление корректно работает с дробями, т.е. например 4 / (1 - 2/3) = 12.
тогда как это понимать?
ну хз, имхо, пусть хоть что-то будет в портфолио, ибо "кодеров" нынче много, смысл тратить время на собеседования (и мне и потенциальному работодателю), если можно посмотреть на что я могу. я решаю задачи с codeabbey и выкладываю решения на гите. завел недавно, но по этим решениям можно понять уровень. порой и китайские вещи очень даже ничего ;-)
мне выбирать не из чего. либо так, либо никак.
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
30.03.2019, 21:23
Цитата Сообщение от wolfbethowen Посмотреть сообщение
4 / (1 - 2/3)
ну нет округления в данном примере,согласен,не лучший вариант указать на точность.. и тем не менее, округления нет.
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
30.03.2019, 21:37
LektorIn, я способным когда-то был. Однако, вышло так, что до нашей группы (до меня лично) рекрутёры не дошли. По моим предположениям из воспоминаний, "соседняя" группа не хотела конкуренции, поэтому нам ничего и не поведала о том, что можно где-то на лабу попасть. А на тот момент надобности в деньгах особой не было. Устраивала повышенная стипендия при среднем балле 9+. А сейчас многое изменилось.

Добавлено через 5 минут
wolfbethowen, там всего около 58.000 вариантов решений может быть. При условии, что подаётся 4 числа от 0 до 9. Я в экселе в самом начале (до написания функции) проглядел, как и что может быть. Вначале показалось задание сложным. В итоге, потом решил, что не такое оно уж и сложное. Я про саму логику вычислений и поиска.
0
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
30.03.2019, 21:40  [ТС]
LektorIn, слушай, а ты ведь прав.
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
30.03.2019, 22:24
Нет, всего возможно 3801 вариант чисел (от 1 до 9), из которых можно составить число 24. Вот бы ещё вспомнить, как их прогнать в качестве покрытия unit-тестами.
0
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
30.03.2019, 22:27  [ТС]
Timoved, так ты тоже кандидат?) показывай код уже! все равно все дано отправили.
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
31.03.2019, 09:24
wolfbethowen,
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
    public boolean canBeEqualTo24(int[] nums) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
 
        final int NUMBER_N = 24;
        int number1, number2, number3, number4;
 
        char operator1, operator2, operator3;
 
        int[] arrNums = nums;
 
        char[] arrChs = new char[4];
        arrChs[0] = '*';
        arrChs[1] = '/';
        arrChs[2] = '+';
        arrChs[3] = '-';
 
        String[] arrStr = new String[7];
        for (int i = 0; i < 7; i++) {
            arrStr[i] = "";
            }
        
        String explanation = "Пояснение: из данного набора чисел невозможно составить выражение, равное 24.";
        boolean isEqualTo24 = false;
        Object result = engine.eval("0");
 
        for (int i = 0; i < 4 && !isEqualTo24; i++) {
            number1 = arrNums[i];
            for (int j = 0; j < 4 && !isEqualTo24; j++) {
                if (j != i) {
                    number2 = arrNums[j];
                    for (int k = 0; k < 4 && !isEqualTo24; k++) {
                        if (k != i && k != j) {
                            number3 = arrNums[k];
                            for (int l = 0; l < 4 && !isEqualTo24; l++) {
                                if (l != i && l != j && l != k) {
                                    number4 = arrNums[l];
                                    
                                    for (int m = 0; m < 4 && !isEqualTo24; m++) {
                                        operator1 = arrChs[m];
                                        for (int n = 0; n < 4 && !isEqualTo24; n++) {
                                            operator2 = arrChs[n];
                                            for (int o = 0; o < 4 && !isEqualTo24; o++) {
                                                operator3 = arrChs[o];
                                                
                                                arrStr[0] = "" + number1 + operator1 + number2 + operator2 + number3 + operator3 + number4;
                                                arrStr[1] = "(" + number1 + operator1 + number2 + ")" + operator2 + number3 + operator3 + number4;
                                                arrStr[2] = "(" + number1 + operator1 + number2 + operator2 + number3 + ")" + operator3 + number4;
                                                arrStr[3] = "" + number1 + operator1 + "(" + number2 + operator2 + number3 + ")" + operator3 + number4;
                                                arrStr[4] = "" + number1 + operator1 + "(" + number2 + operator2 + number3 + operator3 + number4 + ")";
                                                arrStr[5] = "" + number1 + operator1 + number2 + operator2 + "(" + number3 + operator3 + number4 + ")";
                                                arrStr[6] = "(" + number1 + operator1 + number2 + ")" + operator2 + "(" + number3 + operator3 + number4 + ")";
 
                                                for (int p = 0; p < 7; p++) {
                                                    result = engine.eval(arrStr[p]);
                                                    if (result.equals(NUMBER_N)) {
                                                        explanation = "Пояснение: " + arrStr[p] + "=24";
                                                        isEqualTo24 = true;
                                                        break;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        System.out.println(explanation);
        return isEqualTo24;
        }
Добавлено через 2 минуты
wolfbethowen, увидишь плагиат - будешь фиги мне показывать. :-)

Добавлено через 6 минут
Конечно, плохо, что комментариев нет совсем. Ну, если придираться, то можно сразу и забраковать.
0
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
31.03.2019, 10:19  [ТС]
Timoved, блин....опять промахнулся! все мы плагиатом занимаемся ;-) красиво написано)

Добавлено через 23 секунды
LektorIn, так ты тоже кандидат?) показывай код уже! все равно все дано отправили.
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
31.03.2019, 10:39
wolfbethowen, я думаю, что LektorIn не кандидат. Ну, а если судить по нику, то, возможно, это тот самый преподаватель, с которым предстоит встреча во втором этапе. Видно, что знающий в программировании толк человек. А вот потенциальные кандидаты могут и сплагиатить. Если честно, объяснить логику выполнения функции я могу, я ее понимаю, а вот как начнут спрашивать про то, что и как используется, про синтаксис языка (углубленно), тут могу и потонуть. Как мне когда-то объяснял одногруппника, ты должен понимать, что происходит в каждой строчке кода, что из чего берется и нести как бы за это ответственность.
0
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
31.03.2019, 10:58  [ТС]
Timoved, были такие мысли, что преподаватель, потому что условие знает)))особенно про округление и знает что я задавал этот вопрос на нескольких форумах. ну.... не суть. я взялся писать ОПН. как закончу, выложу сюда. думаю, в течении недели, т.к. рабочие дни пошли. интересно будет услышать критику ;-)
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
31.03.2019, 11:32
Нет, возможно он сам когда-то подобное задание решал. Потому и предположил, что это задание для тех, кто желает попасть на Лабу. Если первоклассный специалист он, то на разных форумах, по идее, должен присутствовать. Для того, чтобы черпать информацию, а так же для какой-то обратной связи. Это нормально. А я хочу функцию прогнать и посмотреть, выведет ли 3801 решение? Или хотя бы счётчик решениц дойдет до этого числа?
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
31.03.2019, 11:39
не обязательно быть преподом для того что бы знать условие,кандидатом себя наверное так же назвать сложно.. задание выполнил.(и не спешите со словами "я уже отправил решение"-возможно это решение придется еще три раза переписать..)
0
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
31.03.2019, 11:49  [ТС]
LektorIn, загадочная вы личность. код покажете? ну или хотя бы на словах методику) решение слабенькое, поэтому перепроверил, отправил и взялся за новое. но уже для себя )
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
31.03.2019, 12:00
wolfbethowen, я уже описал методику,причем подробно(ранее), старайтесь писать код так,что бы он был легко читаемым,и конечно нужно сложную задачу разделить на много маленьких и простых. по теории есть много книг,тогда на собеседовании не будете плавать в простых вещах .
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
31.03.2019, 12:16
Заинтересовали меня задачей. ))) Сделаю сегодня-завтра )
0
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
31.03.2019, 14:21
Перебором
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
    public static boolean valid(List<List<Double>> list) {
        final List<DoubleBinaryOperator> operators = List.of(
                (a, b) -> a + b, (a, b) -> Math.abs(a - b),
                (a, b) -> a * b, (a, b) -> b != 0 ? a / b : -1.
        );
        final int size = list.get(0).size();
        return (size > 1) ? valid(list.stream()
                .flatMap(l -> IntStream.range(0, size - 1)
                        .boxed()
                        .flatMap(i -> IntStream.range(i + 1, size)
                                .boxed()
                                .flatMap(j -> operators.stream()
                                        .map(op -> op.applyAsDouble(l.get(i), l.get(j)))
                                        .filter(res -> res > 0)
                                        .map(res -> IntStream.range(0, size)
                                                .filter(n -> n != i && n != j)
                                                .mapToObj(l::get)
                                                .collect(collectingAndThen(toList(), r -> {
                                                    r.add(res);
                                                    return r;
                                                }))
                                        )))).collect(toList()))
                : list.stream().anyMatch(i -> i.get(0) == 24.);
    }
Ну и вызов
Java
1
    valid(List.of(List.of(4., 1., 8., 7.)))
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
31.03.2019, 14:38

Не по теме:

vcrop, excellent!

1
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
31.03.2019, 15:25  [ТС]
vcrop, я даже части не понял
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
31.03.2019, 15:42
Цитата Сообщение от wolfbethowen Посмотреть сообщение
я даже части не понял
глянь что такое java8..коллекции и stream.
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
31.03.2019, 17:17
К слову, я тоже практически ничего не понял. Видно, что другой уровень.

Добавлено через 7 минут
Меня смущает вот это выражение:
Цитата Сообщение от vcrop Посмотреть сообщение
(a, b) -> b != 0 ? a / b : -1
. Не факт, что комбинация 5/0+5*5 не выдаст результат о том, что с помощью этой комбинации будет получено число 24.

Добавлено через 12 минут
Даже не удаётся запустить код на исполнение. Несколько ошибок выдает: The method of((<no type> a, <no type> b) -> {}, (<no type> a, <no type> b) -> {}, (<no type> a, <no type> b) -> {}, (<no type> a, <no type> b) -> {}) is undefined for the type List; Cannot infer type argument(s) for <R> flatMap(Function<? super T,? extends Stream<? extends R>>).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.03.2019, 17:17

Сколькими способами гирями заданного набора можно составить вес в 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. Составить программу, которая позволит напечатать все пары символов, которые можно из этого...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru