Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def get_members(input_string):
- pointer = 0
- members = []
- operators = []
- for i in range(len(input_string)):
- symbol = input_string[i]
- if symbol == '+' or symbol == '-':
- operators.append(symbol)
- members.append(input_string[pointer:i])
- pointer = i + 1
- if i == len(input_string) - 1:
- members.append(input_string[pointer:i+1])
- return members, operators
- def multiplication(polynomial_a, polynomial_b):
- result = {}
- for member_b in polynomial_b:
- for member_a in polynomial_a:
- var = member_a['var'] if member_a['var'] != 'free' else member_b['var']
- poww = member_a['poww'] + member_b['poww']
- if poww != 1 and var != 'free':
- key = var + "^" + str(poww)
- else:
- key = var
- coeff = result.get(key, None)
- if not coeff:
- result[key] = {
- 'k': member_a['coeff'] * member_b['coeff'],
- 'poww': poww
- }
- else:
- result[key]['k'] += member_a['coeff'] * member_b['coeff']
- if result.get('free', None):
- result['free']['poww'] = -10
- final_res = {}
- for member in result.keys():
- if result[member]['k'] != 0:
- final_res[member] = result[member]
- return final_res
- def parse_polynomial(input_string):
- array_of_members, array_of_operators = get_members(input_string)
- res = []
- first_has_sign = False
- for index, member in enumerate(array_of_members):
- if not member:
- first_has_sign = True
- continue
- var = None
- coeff = '-'
- is_poww = False
- poww = None
- for i in member:
- if i.isdigit():
- if not is_poww:
- if coeff == '-':
- coeff = int(i)
- else:
- coeff = coeff * 10 + int(i)
- elif is_poww:
- if not poww:
- poww = int(i)
- else:
- poww = poww * 10 + int(i)
- else:
- if i == '^':
- is_poww = True
- else:
- var = i
- res_member = {
- 'coeff': coeff if coeff != '-' else 1,
- 'var': var if var else 'free',
- 'poww': poww if poww else 1,
- }
- if res_member['var'] == 'free':
- res_member['poww'] = 0
- sign = '+'
- if first_has_sign:
- sign = array_of_operators[index - 1]
- elif index > 0:
- sign = array_of_operators[index - 1]
- if sign == '-':
- res_member['coeff'] *= -1
- res.append(res_member)
- return res
- def polynomial_to_string(polynomial):
- if not polynomial:
- return '0'
- result = ''
- first = True
- for key in sorted(polynomial.keys(), key=lambda _key: polynomial[_key]['poww'], reverse=True):
- coeff = polynomial[key]['k']
- if not first:
- if coeff > 0:
- result += '+'
- if abs(coeff) != 1 or abs(coeff) == 1 and key == 'free':
- result += str(coeff)
- elif coeff == -1:
- result += '-'
- else:
- first = False
- if abs(coeff) != 1 or abs(coeff) == 1 and key == 'free':
- result += str(coeff)
- elif coeff == -1:
- result += '-'
- if key != 'free':
- result += key
- return result
- def calculate(polynomial_str_a, polynomial_str_b):
- return polynomial_to_string(
- multiplication(
- parse_polynomial(polynomial_str_a),
- parse_polynomial(polynomial_str_b)
- )
- )
- polynomial_str_a = input()
- polynomial_str_b = input()
- print(calculate(polynomial_str_a, polynomial_str_b))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement