Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 09.10.2021
Сообщений: 84

Расставить скобки

21.04.2022, 15:21. Показов 6316. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть задачи, вводится алгебраическое выражение, содержащее целые положительные числа и знаки операций: плюс, минус и умножить. Деление не используется Выводится максимальное целое числовое значение выражения с учетом расставленных скобок.
Проще говоря, нужен код который расставит скобки и выведет максимальный результат
пример
ввод 1+2*3-2*4
вывод 28
Python
1
a=eval(input("Введите математическое выражение: "))
помогите сделать алгоритм расставления скобок, не могу понять, как сделать алгоритм который будет понимать где ставить скобки

Добавлено через 2 минуты
UPD Расставит скобки таким образом, чтобы результат был максимальным
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2022, 15:21
Ответы с готовыми решениями:

Расставить ранги
Добрый день! Исходные данные - d1 Ключи - d2 Что должно получится в итоге - d3 import pandas as pd

Скобки
a = print(''.join(str(a))) Как сделать так, чтобы выводилось без квадратных скобок?

Любимые скобки
Я уверен, что 100500 раз спрашивали это, но я что-то не нашел. дан список, например: надо проверить на правильность выставлении...

9
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
21.04.2022, 23:37
Python
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
from random import choice
from random import randint
n = randint(4, 9)
m = 20
ops = ('+-**')
s = ''
for i in range(n):
    s += str( randint(1,m) ) + ' ' + choice( ops ) + ' '
s = s.rstrip( ops+' ' )
print(s)
 
lis = list( map( lambda x: ') '+x+' (' if x in ops else x, list(s) ) )
s = ''.join(lis)
s = '(' + s + ')'
max_val = float('-inf')
max_str = None
par_count = s.count( '(' ) + s.count( ')' )
for i in range( 2 ** par_count ):
    b = bin(i)[2:].zfill(par_count)
    b_ind = 0
    ss = ''
    for symb in s:
        if symb in '()':
            ss += ( '',symb )[ int( b[b_ind] ) ]
            b_ind += 1
        else:
            ss += symb
    try:
        val = eval( ss )
        if val > max_val:
            max_val = val
            max_str = ss
    except:
        pass
print( f'{ max_str } = { max_val }' )
1
0 / 0 / 0
Регистрация: 09.10.2021
Сообщений: 84
21.04.2022, 23:43  [ТС]
А как заменить ввод случайного примера на ввод с клавиатуры?
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
21.04.2022, 23:55
Цитата Сообщение от waze Посмотреть сообщение
как заменить ввод случайного примера на ввод с клавиатуры?
Вот так можно:

Python
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
ops = ('+-*')
s = input( f'Введите арифметическое выражение со знаками операций { list(ops) }: ' )
lis = list( map( lambda x: ') '+x+' (' if x in ops else x, list(s) ) )
s = ''.join(lis)
s = '(' + s + ')'
max_val = float('-inf')
max_str = None
par_count = s.count( '(' ) + s.count( ')' )
for i in range( 2 ** par_count ):
    b = bin(i)[2:].zfill(par_count)
    b_ind = 0
    ss = ''
    for symb in s:
        if symb in '()':
            ss += ( '',symb )[ int( b[b_ind] ) ]
            b_ind += 1
        else:
            ss += symb
    try:
        val = eval( ss )
        if val > max_val:
            max_val = val
            max_str = ss
    except:
        pass
print( f'{ max_str } = { max_val }' )
1
0 / 0 / 0
Регистрация: 09.10.2021
Сообщений: 84
22.04.2022, 00:04  [ТС]
Спасибо, безумно благодарен вам, вы обеспечили мой день хорошим настроением)

Добавлено через 6 минут
А вот если 1+2*3-2*4 такой пример вписать программа выдает ответ 20, а правильно вот так (((1+2)*3)-2)*4 ответ 28
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
22.04.2022, 00:38
Цитата Сообщение от waze Посмотреть сообщение
а правильно вот так (((1+2)*3)-2)*4 ответ 28
Да, здесь недоработка. Если сразу расставлять все потенциальные скобки, то прога зависает. Надо обдумать как это быстрее сделать.
0
0 / 0 / 0
Регистрация: 09.10.2021
Сообщений: 84
22.04.2022, 00:43  [ТС]
У меня если сразу скобки поставить ничего не виснет, только скобки неправильно ставит, пример выше писал
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
22.04.2022, 09:06
Лучший ответ Сообщение было отмечено waze как решение

Решение

Так как у вас в задании не требуется выводить скобки, а только результат, то задача сильно упрощается.

Вот так можно сделать:

Python
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
ops = '+-*'
#==============================================================================
def get_nums_and_ops(s):
    s_ops = list( filter( ops.count, s ) )
    for op in s_ops:
        s = s.replace( op, ' ' )
    s_nums = list( map( int, s.split() ) )
    return ( s_nums, s_ops )
#==============================================================================
s = input( f'Введите арифметическое выражение со знаками операций { list(ops) }: ' )
s_nums_ops = get_nums_and_ops(s)
q = [ s_nums_ops ]
val_max = float( '-inf' )
while q:
    nums_cur, ops_cur = q.pop(0)
    if not ops_cur:
        val_cur = nums_cur[0]
        val_max = max( val_max, val_cur )
    else:
        for i in range( len(ops_cur) ):
            nums_next = nums_cur.copy()
            ops_next  = ops_cur.copy()
            val = eval( str( nums_next[i] ) + ops_next[i] + str( nums_next[i + 1] ) )
            nums_next[i+1] = val
            nums_next.pop(i)
            ops_next.pop(i)
            q.append( ( nums_next, ops_next ) )
print( val_max )
1
0 / 0 / 0
Регистрация: 09.10.2021
Сообщений: 84
22.04.2022, 09:28  [ТС]
Да, теперь вроде как правильно алгоритм работает

Добавлено через 10 минут
А какой смысл этого алгоритма, я имею ввиду как он скобки подставляет, через цикл?

Добавлено через 7 минут
Очень странно код рабочий, а проверочный сайт пишет compilation error, интересно в чем же проблема?
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
22.04.2022, 14:31
Цитата Сообщение от waze Посмотреть сообщение
А какой смысл этого алгоритма, я имею ввиду как он скобки подставляет, через цикл?
Ну, в чем смысл скобок, - чтобы указать последовательность выполнения операций в выражении. Ну а я разделяю выражение на список чисел и список операций и, так сказать, "вручную" выполняю эти операции во всех возможных последовательностях.

Цитата Сообщение от waze Посмотреть сообщение
Очень странно код рабочий, а проверочный сайт пишет compilation error, интересно в чем же проблема?
Ну, скорее всего у них устаревшая версия питона и она не поддерживает что-то из того, что есть в программе.

Добавлено через 2 часа 50 минут
Да, забыл пояснить, что алгоритм, который я использовал для поиска максимального значения, - это классический поиск в ширину.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2022, 14:31
Помогаю со студенческими работами здесь

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

Расставить табуляцию
s = input() L = "(}>" L1 = s.count('(') L2 = s.count('') R3 = s.count('}') R4 = s.count('>') stack = err = False for c in...

Скобки-2
Напишите функцию brackets2() для проверки правильности расстановки скобок четырех видов: ,(),{},<> . Функция возвращает True, если...

Скобки
Проверьте правильность расстановки скобок в выражении. Напишите функцию brackets(), принимающую строку – выражение, содержащее круглые...

Расставить буквы по клеткам
Не могу разобраться как делать!


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru