Как сделать это? Не знаю за что браться
Миша сидел на занятиях математики в Высшей школе экономики и решал следующую задачу: дано три целых числа (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 шт):
среди чисел есть чётные и нечётные
все чётные можно сократить до одного чётного умножив их друг на друга
все нечётные можно сократить до одного нечётного умножив их друг на друга
сложить одно чётное и одно нечётное - получится нечётное
Пример:
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
Если задача в следующем:
- дана последовательность чисел
- менять местами числа нельзя
- расставить знаки между числами, чтобы получился нечётный результат
То код может выглядеть так (генерацию случайных чисел просто для отладки поставил):
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}")
Ну вот так, например:
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 не хочет с умножением работать, а решения этой проблемы какие-то сложные все.