Как сделать это? Не знаю за что браться

Миша сидел на занятиях математики в Высшей школе экономики и решал следующую задачу: дано три целых числа (a=[1,5],b=[5,7],c = [1,2]) и нужно расставить между ними знаки + и × так, чтобы результат полученного арифметического выражения был нечётным (например, между числами 5, 7, 2, можно расставить арифметические знаки следующим образом: 5×7+2 = 37). Миша срочно убегает в гости, от вас требуется написать программу решающую данную задачу.

Какие условия поставить? или как можно перебирать эти числа? пытался сделать так

a = 1 
b = 5 
c = 1 
k=0
for i in range(8):
if (a * b + c) % 2 != 0:
    k += 1
elif a * b + c == 0:
    a = 5
elif (a * b + c) % 2 != 0:
    k += 1
elif a * b + c == 0:
    b = 7
elif (a * b + c) % 2 != 0:
    k += 1
elif (a * b + c) % 2 == 0:
    c = 2
print(k)

Что можно использовать, чтобы в if он проверил каждое число, то есть 1*5+1 потом 5*5+1 и также со знаками.


Ответы (3 шт):

Автор решения: Zhihar

среди чисел есть чётные и нечётные

  1. все чётные можно сократить до одного чётного умножив их друг на друга

  2. все нечётные можно сократить до одного нечётного умножив их друг на друга

  3. сложить одно чётное и одно нечётное - получится нечётное

Пример:

1 4 97 216 332 3 91

чётные:

4 216 332

сокращаем

4 * 216 * 332

нечётные:

1 97 3 91

сокращаем

1 * 97 * 3 * 91

и итог:

4 * 216 * 332 + 1 * 97 * 3 * 91
→ Ссылка
Автор решения: Zhihar

Если задача в следующем:

  1. дана последовательность чисел
  2. менять местами числа нельзя
  3. расставить знаки между числами, чтобы получился нечётный результат

То код может выглядеть так (генерацию случайных чисел просто для отладки поставил):

import random

#nums = list(map(int, input("введите числа: ").split()))

nums = [random.randint(1, 20) for _ in range(10)]

# найти сначала последовательность чётных чисел
part1 = []
for value in nums:
    if value % 2 == 0:
        part1.append(value)
    else:
        break

# найти последовательность нечётных чисел
part2 = []
for value in nums[len(part1):]:
    if value % 2 == 1:
        part2.append(value)
    else:
        break

# найти последовательность оставшихся чисел:
part3 = nums[len(part1) + len(part2):]

# вывести комбинацию:
text1 = '' if len(part1) == 0 else ' * '.join(map(str, part1))
text2 = '' if len(part2) == 0 else ' * '.join(map(str, part2))
text3 = '' if len(part3) == 0 else ' * '.join(map(str, part3))

print(f"{text1} {'+' if len(text1) else '' } {text2} {'+' if len(text3) else ''} {text3}")
→ Ссылка
Автор решения: CrazyElf

Ну вот так, например:

a_list = [1,5]
b_list = [5,7]
c_list = [1,2]
for a,b,c in zip(a_list, b_list, c_list):
    for s1,s2 in ['*+','+*']:
       expression = f'{a}{s1}{b}{s2}{c}'
       result = eval(expression)
       if result % 2:
           print(f'{expression} = {result} нечётное')

Вывод:

5*7+2 = 37 нечётное
5+7*2 = 19 нечётное

Знаю, что eval - это небезопасно, но что-то ast.literal_eval не хочет с умножением работать, а решения этой проблемы какие-то сложные все.

→ Ссылка