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

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

27.03.2019, 22:15. Показов 11715. Ответов 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
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
31.03.2019, 17:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Timoved Посмотреть сообщение
Не факт
там дальше фильтр res > 0, такого варианта рассматриваться не будет.
List.of в java9 появилась.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
31.03.2019, 20:53
криво, но работает для любой длинны цифр:
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
import java.util.*;
import java.util.List;
 
class Search {
    private static final String[] OPERATORS = {"+", "-", "/", "*"};
    private static final String LABEL_NUMBER = "N";
    private static final String LABEL_OPERATOR = "OP";
 
    private final Statistic statistic;
    private final Map<Integer, Set<String>> resultTree;
 
    Search(int... numbers) {
        this.statistic = new Statistic();
        this.resultTree = this.parse(numbers);
    }
 
    private void checkArgument(int[] numbers) {
        if (numbers == null || numbers.length == 0) {
            throw new IllegalArgumentException("Incorrect input argument...");
        }
    }
 
    private String[] intToStringArray(int... numbers) {
        String[] stringInts = new String[numbers.length];
        for (int index = 0; index < numbers.length; index++) {
            stringInts[index] = String.valueOf(numbers[index]);
        }
        return stringInts;
    }
 
    private Map<Integer, Set<String>> parse(int... numbers) {
        long start = System.currentTimeMillis();
        checkArgument(numbers);
        this.statistic.setNumbers(numbers);
 
        List<String> combinationNumbers = recursionCombinations(new ArrayList<>(), intToStringArray(numbers),
                "", false, numbers.length);
        this.statistic.setCombinationsNumbers(combinationNumbers.size());
 
        List<String> combinationOperators = recursionCombinations(new ArrayList<>(), OPERATORS,
                "", true, numbers.length - 1);
        this.statistic.setCombinationsOperators(combinationOperators.size());
 
        List<String> combinationsSolutions = recursionCombinations(new ArrayList<>(), numbers.length - 1,
                numbers.length, "", 2);
        this.statistic.setCombinationsPolish(combinationsSolutions.size());
 
        List<Stack<String>> shareCombinations = getAllCombinations(combinationNumbers, combinationOperators, combinationsSolutions);
        this.statistic.setShareCombinations(shareCombinations.size());
 
        Map<Integer, Set<String>> tree = getFullSolutions(shareCombinations, intToStringArray(numbers));
 
        this.statistic.setTimeMS(System.currentTimeMillis() - start);
        return tree;
    }
 
    private List<String> recursionCombinations(List<String> list, String[] array, String line, boolean duplicate, int length) {
        if (list != null && array != null && line != null) {
            if (length == 0) {
                line = line.trim();
                if (!line.isEmpty()) {
                    list.add(line.trim());
                }
            } else {
                for (int index = 0; index < array.length; index++) {
                    String[] nextArray = duplicate ? array : removeElementToArray(array, index);
                    String nextLine = line.concat(" ").concat(array[index]);
                    list = recursionCombinations(list, nextArray, nextLine, duplicate, length - 1);
                }
            }
        }
        return list;
    }
 
    private String[] removeElementToArray(String[] array, int index) {
        String[] result = null;
        if (array != null && array.length > 0) {
            result = array.clone();
            if (index < result.length - 1) {
                System.arraycopy(result, index + 1, result, index, result.length - index - 1);
            }
            result = Arrays.copyOf(result, result.length - 1);
        }
        return result;
    }
 
    private List<Stack<String>> getAllCombinations(List<String> numbers, List<String> operators, List<String> variants) {
        List<Stack<String>> list = new ArrayList<>();
        for (String variant : variants) {
            for (String operator : operators) {
                String[] arrayO = operator.split("\\s");
                for (String number : numbers) {
                    String[] arrayN = number.split("\\s");
                    Stack<String> stack = new Stack<>();
                    int o = 0;
                    int n = 0;
                    for (String element : variant.split("\\s")) {
                        if (element.equals(LABEL_NUMBER)) {
                            stack.push(arrayN[n++]);
                        } else {
                            stack.push(arrayO[o++]);
                        }
                    }
                    list.add(stack);
                }
            }
        }
        return list;
    }
 
    private String getDuplicateString(String str, int amount) {
        String result = "";
        for (int count = 0; count < amount; count++) {
            result = result.concat(str);
        }
        return result;
    }
 
    private List<String> recursionCombinations(List<String> list, int operators, int numbers, String line, int min) {
        if (numbers == min) {
            line = getDuplicateString(LABEL_NUMBER, numbers).
                    concat(getDuplicateString(LABEL_OPERATOR, operators)).concat(line);
 
            line = line.replaceAll(LABEL_OPERATOR, LABEL_OPERATOR.concat(" ")).
                    replaceAll(LABEL_NUMBER, LABEL_NUMBER.concat(" ")).trim();
            list.add(line);
        } else if (numbers > min) {
            String next;
            int end = line.length() == 0 ? 1 : 0;
            for (int count = operators; count >= end; count--) {
                next = LABEL_NUMBER.concat(getDuplicateString(LABEL_OPERATOR, count)).concat(line);
                list = recursionCombinations(list, operators - count, numbers - 1, next, min);
            }
        }
        return list;
    }
 
    private boolean isNumber(String line) {
        return line.matches("[+-]*\\d+");
    }
 
    private Integer getResult(int first, int second, String operator) {
        Integer result = null;
        switch (operator) {
            case "+":
                result = first + second;
                break;
            case "-":
                result = first - second;
                break;
            case "*":
                result = first * second;
                break;
            case "/":
                if (second != 0 && first % second == 0) {
                    result = first / second;
                }
                break;
            default:
                result = first;
        }
        return result;
    }
 
    private int getPriority(String line) {
        int priority = 0;
        for (String element : line.split("\\s")) {
            if (!element.matches("[-]*\\d+")) {
                priority = element.equals("*") || element.equals("/") ? 2 : 1;
            }
        }
        return priority;
    }
 
    private String getString(String first, String second, String operator) {
        int priority = getPriority(operator);
        first = !isNumber(first) ? priority > getPriority(first) ? "(".concat(first).concat(")") : first : first;
        second = !isNumber(second) ? priority > getPriority(second) ? "(".concat(second).concat(")") : second : second;
        return first.concat(" " + operator + " ").concat(second);
    }
 
    private Map<Integer, Set<String>> getFullSolutions(List<Stack<String>> list, String[] numbers) {
        Map<Integer, Set<String>> tree = new TreeMap<>();
        if (numbers.length == 1) {
            Integer number = Integer.parseInt(numbers[0]);
            tree.put(number, new HashSet<>());
            tree.get(number).add(numbers[0]);
        } else {
            for (Stack<String> stack : list) {
                Stack<Integer> result = new Stack<>();
                Stack<String> line = new Stack<>();
                for (String element : stack) {
                    if (isNumber(element)) {
                        result.push(Integer.parseInt(element));
                        line.push(element);
                    } else {
                        if (result.size() >= 2) {
                            int second = result.pop();
                            int first = result.pop();
                            String two = line.pop();
                            String one = line.pop();
                            String formula = getString(one, two, element);
                            line.push(formula);
                            Integer solution = getResult(first, second, element);
                            if (solution != null) {
                                result.push(solution);
                            } else {
                                result.clear();
                                line.clear();
                                break;
                            }
                        } else {
                            result.clear();
                            line.clear();
                            break;
                        }
                    }
                }
 
                if (result.size() == 1 && line.size() == 1) {
                    Integer answer = result.pop();
                    if (!tree.containsKey(answer)) {
                        tree.put(answer, new HashSet<>());
                    }
                    tree.get(answer).add(line.pop());
                }
            }
        }
        return tree;
    }
 
    boolean checkAnswer(int answer) {
        return this.resultTree.containsKey(answer);
    }
 
    Set<String> getSolutionByAnswer(int answer) {
        return checkAnswer(answer) ? this.resultTree.get(answer) : new HashSet<>();
    }
 
    @Override
    public String toString() {
        return this.statistic.toString();
    }
 
    private class Statistic {
        private long timeMS;
        private int[] numbers;
        private int combinationsNumbers;
        private int combinationsOperators;
        private int combinationsPolish;
        private int shareCombinations;
 
        void setNumbers(int[] numbers) {
            this.numbers = numbers;
        }
 
        void setCombinationsNumbers(int combinationsNumbers) {
            this.combinationsNumbers = combinationsNumbers;
        }
 
        void setCombinationsOperators(int combinationsOperators) {
            this.combinationsOperators = combinationsOperators;
        }
 
        void setTimeMS(long timeMS) {
            this.timeMS = timeMS;
        }
 
        void setCombinationsPolish(int combinationsPolish) {
            this.combinationsPolish = combinationsPolish;
        }
 
        void setShareCombinations(int shareCombinations) {
            this.shareCombinations = shareCombinations;
        }
 
        private String parseLongToString() {
            return String.format("%d sec. %d ms", this.timeMS / 1_000, this.timeMS % 1000);
        }
 
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append(String.format("%30s", "STATISTIC")).append("\n");
            sb.append(String.format("%-30s %s;", "Numbers:", Arrays.toString(this.numbers))).append("\n");
            sb.append(String.format("%-30s %d;", "Combinations numbers:", this.combinationsNumbers)).append("\n");
            sb.append(String.format("%-30s %d;", "Combinations operators:", this.combinationsOperators)).append("\n");
            sb.append(String.format("%-30s %d;", "Combinations brackets:", this.combinationsPolish)).append("\n");
            sb.append(String.format("%-30s %d;", "Share amount combinations:", this.shareCombinations)).append("\n");
            sb.append(String.format("%-30s %s;", "Spent time:", parseLongToString())).append("\n");
            return sb.toString();
        }
    }
}
 
class SearchTest {
    public static void main(String[] args) {
        Search search = new Search(4, 1, 8, 7);
 
        //выводим статистику парсинга
        System.out.println(search);
 
        System.out.println("Есть ли ответ 24?: " + search.checkAnswer(24) + ";");
 
        //получаем все варианты для ответа 24
        Set<String> answers = search.getSolutionByAnswer(24);
        System.out.println("Ответ 24:");
        for (String line : answers) {
            System.out.println("    " + line + ";");
        }
    }
}
Добавлено через 29 секунд
вывод:

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
                     STATISTIC
Numbers:                       [4, 1, 8, 7];
Combinations numbers:          24;
Combinations operators:        64;
Combinations brackets:         6;
Share amount combinations:     9216;
Spent time:                    1 sec. 32 ms;
 
Есть ли ответ 24?: true;
Ответ 24:
    8 / 1 * (7 - 4);
    8 * (7 * 1 - 4);
    8 * (1 * (7 - 4));
    8 * (1 * 7 - 4);
    1 * (7 - 4) * 8;
    8 * (7 - 4) * 1;
    (7 - 4) * 8 / 1;
    8 * 4 - 7 + 1;
    (7 + 1) * 4 - 8;
    8 * 7 - 1 * 4;
    4 * 8 - 7 - 1;
    (1 + 7) * 4 - 8;
    (8 * (7 - 4)) / 1;
    8 * 1 * (7 - 4);
    4 * 8 - 7 + 1;
    1 * 8 * (7 - 4);
    8 * (7 - 4) / 1;
    (7 - 4) * 8 * 1;
    7 - 1 * 4 * 8;
    (8 * (7 - 4)) * 1;
    8 * 4 - 7 - 1;
    4 * 8 - 1 - 7;
    8 * 4 - 1 + 7;
    (7 - 1) * (8 - 4);
    8 * (7 / 1 - 4);
    8 * 4 - 1 - 7;
    (1 * (7 - 4)) * 8;
    4 * 8 - 1 + 7;
    8 * 7 - 4 / 1;
    7 - 4 / 1 * 8;
    (7 * 1 - 4) * 8;
    (4 - 8) * (1 - 7);
    (7 / 1 - 4) * 8;
    (8 - 4) * (7 - 1);
    (7 - 4) / 1 * 8;
    (1 * 7 - 4) * 8;
    (1 - 7) * (4 - 8);
    1 * (8 * (7 - 4));
    4 * (7 + 1) - 8;
    4 * (1 + 7) - 8;
    (7 - 4) * 1 * 8;
    7 - 4 * 1 * 8;
    8 * 7 - 4 * 1;
 
Process finished with exit code 0
2
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
31.03.2019, 22:04
ArtemFM, если учитывать здание, то длинный код. А вот если бы вдруг задали (дополнительно) переделать задание так, чтобы оно выводило ещё и все варианты, то довольно неплохо всё получилось.

Добавлено через 1 минуту
К слову, в коде где-то есть ошибка. Вывелся вариант: 8*4-7+1, результат - 26, а не 24. И таких результатов много.

Добавлено через 3 минуты
Всего их десять: =8*4-7+1, =8*7-1*4, =4*8-7+1, =7-1*4*8, =8*4-1+7, =4*8-1+7, =8*7-4/1, =7-4/1*8, =7-4*1*8, =8*7-4*1. Результат всех этих операций не равен 24, но они были выведены. Скорее всего, ошибка в том, что не проставлены скобки.

Добавлено через 1 минуту
8*4-7+1=26, а вот 8*4-(7+1)=24.
8*7-1*4=52, а 8*(7-1*4)=24.
Остальные не смотрел, но, думаю, что в том же духе.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
31.03.2019, 22:24
Timoved,
первое: всегда нужно стараться делать задачу так, чтоб она была более универсальна и её доработка не требовала много усилий
второе: кода много и можно алгоритмы методов усовершенствовать и сократить, я знаю, но написал часа за 3 на скорую руку. Если потратить ещё 2 раза по столько же, то можно его усовершенствовать
третье: по поводу неправильных вариантов. Тут верно. Там не очень правильно расчитывается понижение приоритета операции. Отправил, потом увидел, но сейчас уже не очень голова соображает переделывать метод getPriority() и getString(), но на свежую голову исправить не проблема

P.S. Код даёт лишь пищу для размышлений, а не служит для сдачи. Суть его в том, что он сразу ищет все решения и варианты решений и помещает их в дерево. А уже потом при вызове checkAnswer и getAnswers берёт всё ужде из дерева, где всё есть. Чисто написать для пищи к размышлению )))

Добавлено через 1 минуту
Цитата Сообщение от ArtemFM Посмотреть сообщение
Там не очень правильно расчитывается понижение приоритета операции.
проще сказав, сам пример построен правильно, а вот скобки не везде, где нужно, проставлены
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
31.03.2019, 22:30
В целом, хорошо. Хотя бы более-менее читаем код. Я лишь отчасти согласен.
Цитата Сообщение от ArtemFM Посмотреть сообщение
всегда нужно стараться делать задачу так, чтоб она была более универсальна и её доработка не требовала много усилий
- вот с этим. Но тут нужно искать золотую середину.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
31.03.2019, 22:33
Цитата Сообщение от Timoved Посмотреть сообщение
если учитывать здание, то длинный код
а есть ограничения по кол-ву строк в задаче??? Я например считаю, что много методов можно разделить на несколько методов и спрятать реализацию по паттерну Facade придерживаясь и код увеличится. А если ещё Java доки писать и тесты, то труба
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
31.03.2019, 22:49
ArtemFM, нет, ограничений по числу строк нет. Вообще нет никаких ограничений. Просто не ясно, что требуется показать в своем решении. Показать логику - ну, маловероятно. Показать свои знания - ну, тогда чего идти как бы учиться, на лабу? Вот что-то про деление с дробями упоминали. Просто не ясно, что требуют как бы от потенциальных кандидатов. И можно ведь на разном уровне писать. Я написал на самом простом, самом низком уровне.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
31.03.2019, 22:56
Задача, на самом деле, не так и проста. Тут по сути есть где и рекурсию применить и коллекции и алгоритмы.
Я не знаю, какой у Вас там входной порог на курсы, но если такая задача, то по крайней мере отсеивается людей не мало...
Возможно им достаточно, чтоб просто работала. Я не знаю. Но сама задача даёт попыхтеть мозгу ) Хотямдля какого-то, возможно, эта задачка раз плюнуть, но для меня она вызвала интерес, потому что такую задачу ни разу не реализовывал.
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
01.04.2019, 11:54
ArtemFM, я умаю, всё относительно. Там два шага. Вначале нужно разработать функцию. Представьте ваше решение в виде java-функции вида:
public boolean canBeEqualTo24(int[] nums) {
...
}
Ввиду того, что простая постановка вопроса, потому и решил простой алгоритм отправить.

Добавлено через 21 секунду
А на втором этапе - собеседование с преподавателем.
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
01.04.2019, 20:24
Пришёл ответ. Мой вариант не верный. Неверно решает. Не зря нам про округления говорилис.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
01.04.2019, 20:47
А при чём тут округление?
Смотри, в итоге должно получится 24, судя по названию метода. У них просто есть для теста n кол-во выражений с 4-мя числами, которые дают 24 и проверяют метод на корректность

По сути нам нужно получить int. На кой нам огруглять? Допустим 6 / 4 * 2 * 8 = 24
ок, тут 6/4 даёт нам 1,5, затем 3 и 24... Но программа всегда может обойти получение дробного числа:
6 * 2 / 4 * 8 = 24 и нет дробей

Добавлено через 1 минуту
По мне так вообще должна программа смотреть, если b == 0 || a % b != 0 - то это выражение даже не рассматривать!

Добавлено через 4 минуты
а огругление вообще может сделать злую шутку:
0.9 * 10 = 90;

а вот если бы мы 0.9 округлили до 1, то получили бы 100. Это вообще большая погрешность.

или

0.4 * 10 = 4 против округлённого 0.4 в 0 * 10 = 0

Добавлено через 8 минут
в Вашем задании нужно просто учесть, что есть 4 числа a, b, c, d

они могут:
- считаться сначала по отдельности (a op b) op (c op d);
- считаться блок цифр и одно число (a op b op c) op d
- и просто линейно a op b op c op d;

и потом по таким комбинациям генерировать возможные расстановки операторов и цифр...
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
01.04.2019, 20:52
Цитата Сообщение от Timoved Посмотреть сообщение
Мой вариант не верный. Неверно решает
не расстраивайся ,не у тебя одного, проблема в том, что у них в задании не указана точность(например до семи знаков после запятой) поэтому если пишешь с округлением-половина проверочных вариантов не пройдет,потому как 24.1 это не 24.. а если пишешь с большой точностью то так же не прокатит,потому как 24.0000000000008 например у них считается как 24. с какого момента начинать округлять-никто не знает,вариант с Double так же не катит.. вообще загвоздка в том что им нужна точность,но до какого знака,и в какую сторону округлять-никто не говорит. поэтому не расстраивайся лишний раз.

Добавлено через 3 минуты
Цитата Сообщение от ArtemFM Посмотреть сообщение
а вот если бы мы 0.9 округлили до 1, то получили бы 100
в том то и проблема что человек проверяющий вполне может быть что вообще не понимает о чем речь, я просто забил на это дело. у меня все работает,проблема не в алгоритме,все это пишется быстро, не зная с какого порога начинать округление-никогда не получить нужного варианта работающего кода.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
01.04.2019, 21:10
А с чего Вы вообще решили, что нужно что-то округлять???
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
01.04.2019, 21:14
Проблема в том, что result.equals(24) выдаёт истину только в том случае, когда result=24, а если result=24.0, выдаёт ложь. Это можно легко поправить, изменив на result.equals(24) || result.equals(24.0). Может, кто посоветует, как можно ещё это сделать?

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

Пример 2.
На входе: [1, 2, 1, 2]
На выходе: false
Пояснение: из данного набора чисел невозможно составить выражение, равное 24.

Примечание: убедитесь, что в вашем решении деление корректно работает с дробями, т.е. например 4 / (1 - 2/3) = 12.

Представьте ваше решение в виде java-функции вида:
public boolean canBeEqualTo24(int[] nums) {
...
}
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
01.04.2019, 21:19
так и не должно получаться у Вас вообще дробное число. если допустим в варианте решения есть деление, которое приведёт к дробному числу, то это выражение вообще рассматривать не нужно. Должно быть деление нацело! Откуда вообще Вы взяли 24.0 24.00008. Таких ответов вообще быть не должно. Только целые и int
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
01.04.2019, 21:28
Цитата Сообщение от ArtemFM Посмотреть сообщение
А с чего Вы вообще решили, что нужно что-то округлять???
да потому что если у тебя int(отбрасываешь дробную часть) -то это у тебя программа работает НЕ ВЕРНО(проверено уже) если у тебя в ответе 24.0000000007 к примеру то это почему то округляется до 24(у них в программе,но у меня то к примеру не округляется а значит 24!=24.0000007 например).

Добавлено через 2 минуты
целое число можно представить как 24 ,или например 24.0 ,или 24.00000000000000000 это все будет 24. и это все будет одно и то же целое число. в конторе которая дала это задание 24.0000000007 считается как 24. а если я округляю скажем 24.1 до 24 -то это уже не правильно .. вот такие пироги .

Добавлено через 1 минуту
Цитата Сообщение от ArtemFM Посмотреть сообщение
Таких ответов вообще быть не должно
но они есть! это факт)))

Добавлено через 1 минуту
Цитата Сообщение от ArtemFM Посмотреть сообщение
то это выражение вообще рассматривать не нужно
я вроде тоже так думал, по началу.. вы правы) . в общем не имея нормального задания можно тыкаться очень долго.. любая задачка на числа и точность должна предполагать какие то вводные,типа точности,данных по округлению и прочее ..
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
01.04.2019, 21:30
Object result = engine.eval("(3/7+3)*7"); - результат 24.0
Object result = engine.eval("(1+1+1+)*8"); -результат 24
result.equals(24) - работает корректно только по отношению к результатам 24, а к результатам 24.0 - неверно. Как поправить? Как правильно сравнивать типы Object и другие? Например, float.
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
01.04.2019, 21:32
Timoved, обрезай ноль если он есть и потом сверяй с нужным ответом
0
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
01.04.2019, 21:33
Как обрезать? Пока сложность в том, как перевести тип object в любой другой.
0
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 25
01.04.2019, 21:39
Java
1
2
3
4
 Object o = "24.0";//как у тебя  в примере 
        String r = o.toString();
        r = r.substring(0, 2);
        System.out.println(r);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.04.2019, 21:39

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 02.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru