Вы хотите, чтобы я составилааа выражение, вставив между цифрами знаки неменяяпорядокцифрне меняя порядок цифрнеменяяпорядокцифр, чтобы получилось заданное равенство? Или нужна идея/алгоритм для таких задач? Уточните, пожалуйста, какие операции разрешены плюс,минус,умножение,деление,возведениевстепень,скобкиит.п.плюс, минус, умножение, деление, возведение в степень, скобки и т. п.плюс,минус,умножение,деление,возведениевстепень,скобкиит.п., и нужно ли учитывать объединение соседних цифр в многозначные числа это,судяпопримеру123=15—даэто, судя по примеру 123 = 15 — даэто,судяпопримеру123=15—да.
Ниже — кратно и наглядно: если разрешены только +, -, *, / и конкатенация цифр, то можно перебрать все способы разбить строку цифр на числа и поставить между ними операторы. Пример кода на Python для поиска всех выражений, дающих заданное значение безучётаскобок,сплавающейточкойдляделениябез учёта скобок, с плавающей точкой для делениябезучётаскобок,сплавающейточкойдляделения:
# перебор всех способов разбить строку на числа конкатенацияразрешенаконкатенация разрешенаконкатенацияразрешена
n = lendigitsdigitsdigits
# маска разрезов: между i и i+1 либо разрез, либо нет for cut_mask in range(1 << (n - 1)): parts =
cur = digits000
for i in rangen−1n - 1n−1: if (cut_mask >> i) & 1: parts.appendcurcurcur
cur = digitsi+1i+1i+1
else: cur += digitsi+1i+1i+1
parts.appendcurcurcur k = lenpartspartsparts
if k == 0: continue # если только одно число, просто сравнить if k == 1: try: if absfloat(parts[0])−targetfloat(parts[0]) - targetfloat(parts[0])−target < 1e-9: results.appendparts[0]+"="+str(target)parts[0] + " = " + str(target)parts[0]+"="+str(target)
except: pass continue # перебор всех сочетаний операторов между частями for op_choice in itertools.productops,repeat=k−1ops, repeat=k-1ops,repeat=k−1: expr = parts000
for op, p in zipopchoice,parts[1:]op_choice, parts[1:]opchoice,parts[1:]: expr += op + p # безопасная проверка деления на 0 и вычисление try: val = evalexprexprexpr
except ZeroDivisionError: continue except Exception: continue if absval−targetval - targetval−target < 1e-9: results.appendexpr+"="+str(target)expr + " = " + str(target)expr+"="+str(target)
return sortedset(results)set(results)set(results)
Пример использования: print(find_expressions("123", 15))
вернёт ′12+3=15′'12+3 = 15'′12+3=15′
Если нужны скобки разныеприоритетыоперацийразные приоритеты операцийразныеприоритетыопераций — можно расширить перебор, генерируя все возможные бинарные скобочные расстановки деревьядеревьядеревья над частями, но это усложняет реализацию.
Напишите, пожалуйста: какое конкретно выражение надо получить какаястрокацифрикакойрезультаткакая строка цифр и какой результаткакаястрокацифрикакойрезультат и какие операции разрешены — решу или подскажу дальше.
Вы хотите, чтобы я составилааа выражение, вставив между цифрами знаки неменяяпорядокцифрне меняя порядок цифрнеменяяпорядокцифр, чтобы получилось заданное равенство? Или нужна идея/алгоритм для таких задач? Уточните, пожалуйста, какие операции разрешены плюс,минус,умножение,деление,возведениевстепень,скобкиит.п.плюс, минус, умножение, деление, возведение в степень, скобки и т. п.плюс,минус,умножение,деление,возведениевстепень,скобкиит.п., и нужно ли учитывать объединение соседних цифр в многозначные числа это,судяпопримеру123=15—даэто, судя по примеру 123 = 15 — даэто,судяпопримеру123=15—да.
Ниже — кратно и наглядно: если разрешены только +, -, *, / и конкатенация цифр, то можно перебрать все способы разбить строку цифр на числа и поставить между ними операторы. Пример кода на Python для поиска всех выражений, дающих заданное значение безучётаскобок,сплавающейточкойдляделениябез учёта скобок, с плавающей точкой для делениябезучётаскобок,сплавающейточкойдляделения:
def find_expressionsdigits,targetdigits, targetdigits,target:
# перебор всех способов разбить строку на числа конкатенацияразрешенаконкатенация разрешенаконкатенацияразрешена n = lendigitsdigitsdigits # маска разрезов: между i и i+1 либо разрез, либо нетimport itertools, math
ops = ′+′,′−′,′∗′,′/′'+', '-', '*', '/'′+′,′−′,′∗′,′/′ results =
for cut_mask in range(1 << (n - 1)):
parts = cur = digits000 for i in rangen−1n - 1n−1:
if (cut_mask >> i) & 1:
parts.appendcurcurcur cur = digitsi+1i+1i+1 else:
cur += digitsi+1i+1i+1 parts.appendcurcurcur
k = lenpartspartsparts if k == 0:
continue
# если только одно число, просто сравнить
if k == 1:
try:
if absfloat(parts[0])−targetfloat(parts[0]) - targetfloat(parts[0])−target < 1e-9:
results.appendparts[0]+"="+str(target)parts[0] + " = " + str(target)parts[0]+"="+str(target) except:
pass
continue
# перебор всех сочетаний операторов между частями
for op_choice in itertools.productops,repeat=k−1ops, repeat=k-1ops,repeat=k−1:
expr = parts000 for op, p in zipopchoice,parts[1:]op_choice, parts[1:]opc hoice,parts[1:]:
expr += op + p
# безопасная проверка деления на 0 и вычисление
try:
val = evalexprexprexpr except ZeroDivisionError:
continue
except Exception:
continue
if absval−targetval - targetval−target < 1e-9:
results.appendexpr+"="+str(target)expr + " = " + str(target)expr+"="+str(target) return sortedset(results)set(results)set(results)
Пример использования:
вернёт ′12+3=15′'12+3 = 15'′12+3=15′print(find_expressions("123", 15))
Если нужны скобки разныеприоритетыоперацийразные приоритеты операцийразныеприоритетыопераций — можно расширить перебор, генерируя все возможные бинарные скобочные расстановки деревьядеревьядеревья над частями, но это усложняет реализацию.
Напишите, пожалуйста: какое конкретно выражение надо получить какаястрокацифрикакойрезультаткакая строка цифр и какой результаткакаястрокацифрикакойрезультат и какие операции разрешены — решу или подскажу дальше.