|
6 / 4 / 2
Регистрация: 09.01.2018
Сообщений: 59
|
||||||
Можно ли построить из заданного набора выражение, равное числу N27.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 начал писать.... вроде как что-то да и получалось, но тут возник с подставлением скобок. и никак не могу придумать как правильно их ставить. ведь если она открывается или закрывается, то и расположение относительно арифм.знака меняется. вот код который получился, но не работает. подскажите как поступить. и можно ли как-то упростить эту гору циклов:
0
|
||||||
| 27.03.2019, 22:15 | |
|
Ответы с готовыми решениями:
127
Проверить, можно ли из заданного набора букв составить заданное слово Определить, сколько прямоугольных треугольников можно создать из заданного набора точек |
|
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
|
||
| 31.03.2019, 17:31 | ||
|
List.of в java9 появилась.
0
|
||
|
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
|
|||||||||||
| 31.03.2019, 20:53 | |||||||||||
|
криво, но работает для любой длинны цифр:
вывод:
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
|
|
|
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
|
||
| 31.03.2019, 22:24 | ||
|
Timoved,
первое: всегда нужно стараться делать задачу так, чтоб она была более универсальна и её доработка не требовала много усилий второе: кода много и можно алгоритмы методов усовершенствовать и сократить, я знаю, но написал часа за 3 на скорую руку. Если потратить ещё 2 раза по столько же, то можно его усовершенствовать третье: по поводу неправильных вариантов. Тут верно. Там не очень правильно расчитывается понижение приоритета операции. Отправил, потом увидел, но сейчас уже не очень голова соображает переделывать метод getPriority() и getString(), но на свежую голову исправить не проблема P.S. Код даёт лишь пищу для размышлений, а не служит для сдачи. Суть его в том, что он сразу ищет все решения и варианты решений и помещает их в дерево. А уже потом при вызове checkAnswer и getAnswers берёт всё ужде из дерева, где всё есть. Чисто написать для пищи к размышлению ))) Добавлено через 1 минуту
0
|
||
|
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
|
||
| 31.03.2019, 22:30 | ||
|
В целом, хорошо. Хотя бы более-менее читаем код. Я лишь отчасти согласен.
0
|
||
|
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
|
||
| 31.03.2019, 22:33 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 29.03.2019
Сообщений: 61
|
|
| 31.03.2019, 22:49 | |
|
ArtemFM, нет, ограничений по числу строк нет. Вообще нет никаких ограничений. Просто не ясно, что требуется показать в своем решении. Показать логику - ну, маловероятно. Показать свои знания - ну, тогда чего идти как бы учиться, на лабу? Вот что-то про деление с дробями упоминали. Просто не ясно, что требуют как бы от потенциальных кандидатов. И можно ведь на разном уровне писать. Я написал на самом простом, самом низком уровне.
0
|
|
|
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
|
|
|
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 | |||
|
Добавлено через 3 минуты
0
|
|||
|
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
|
|
|
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 | ||||
|
Добавлено через 2 минуты целое число можно представить как 24 ,или например 24.0 ,или 24.00000000000000000 это все будет 24. и это все будет одно и то же целое число. в конторе которая дала это задание 24.0000000007 считается как 24. а если я округляю скажем 24.1 до 24 -то это уже не правильно .. вот такие пироги . Добавлено через 1 минуту Добавлено через 1 минуту
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 | ||||||
0
|
||||||
| 01.04.2019, 21:39 | |
|
Сколькими способами гирями заданного набора можно составить вес в v грамм Пирамиду какой наибольшей высоты можно построить из набора блоков Сколькими способами гирями заданного набора весов можно составить вес в v грамм? Строки. Напечатать все пары символов, которые можно из заданного набора составить
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Море в объективе
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 и то, что с ним. . .
|