
多项式除法的问题,可将字符串转为{次数:系数}的dict保存起来,然后进行四则混合运算.并将结果输出.具体与手算区别不大,唯一要注意的是:
1.±1的处理
2.0次项处理
3.空字符串处理
4.合并同次数项.
下面的poly类可以接受一个字符串或者dict来初始化,可做+-*/四则混合运算,可以print或者str()转为字符串输出.
这是个多项式除法的例子,该类也可被用来化简多项式.
class poly(object):
# equation class, read string in, save the polynomial equation
def __init__(self,eq):
if isinstance(eq,str):
if len(eq)==0:
self.dic = {}
else:
eq = eq.replace('-','+-')
self.dic = {} # use loop to process case like: x+x+3 = 2*x+3
for part in eq.split('+'):
if len(part)==0: continue
self.dic[part.count('x')] = self.dic.get(part.count('x'),0) + \
float(part.replace('*','').replace('x','')!='' and \
(part.replace('*','').replace('x','')!='-' and part.replace('*','').replace('x','') or \
-1) or 1)
elif isinstance(eq,dict):
self.dic = eq
else:
self.dic = {}
def order(self):
if len(self.dic)==0: return 0
return max(self.dic.keys())
def __repr__(self):
# str()
if len(self.dic)==0:
return ''
s = []
for k in sorted(self.dic.keys(),reverse=True):
s.append((self.dic[k]==-1 and (k==0 and '-1' or '-') or \
(self.dic[k]!=1 and str(int(self.dic[k])==self.dic[k] and int(self.dic[k]) or self.dic[k]) + \
(k>0 and '*' or '') or (k==0 and '1' or ''))) + \
'*'.join('x'*k))
return '+'.join(s).replace('+-','-')
def __add__(self,x):
# a + b
new_dic = {}
for k in self.dic.keys()+x.dic.keys():
new_dic[k] = self.dic.get(k,0)+x.dic.get(k,0)
new_dic = {k:v for k,v in new_dic.items() if v!=0}
return poly(new_dic)
def __sub__(self,x):
# a - b
new_dic = {}
for k in self.dic.keys()+x.dic.keys():
new_dic[k] = self.dic.get(k,0)-x.dic.get(k,0)
new_dic = {k:v for k,v in new_dic.items() if v!=0}
return poly(new_dic)
def __mul__(self,x):
# a * b
new_dic = {}
for k1,v1 in self.dic.items():
for k2,v2 in x.dic.items():
ck = k1+k2
cv = v1*v2
new_dic[ck] = new_dic.get(ck,0)+cv
new_dic = {k:v for k,v in new_dic.items() if v!=0}
return poly(new_dic)
def __div__(self,x):
# a / b
max_x = x.order()
if self.order() < max_x:
return [str(poly({})),str(self)]
else:
new_dic = self.dic # save original dic
q = poly({})
while self.order() >= max_x:
cur_k = self.order()-max_x
cur_v = self.dic[self.order()]/x.dic[max_x]
q.dic[cur_k] = cur_v
self -= poly({cur_k:cur_v})*x
r = self.dic
self.dic = new_dic
return [str(q),str(poly(r))]
def checkio(data):
a, b = data
ap = poly(a)
bp = poly(b)
result = ap/bp
print a,'/',b,'=',result
return result
checkio(["x*x*x-12*x*x-42","x-3"])
#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
assert checkio(['x*x*x-12*x*x-42', 'x-3']) == ['x*x-9*x-27', '-123'], "1st"
assert checkio(['x*x-1', 'x+1']) == ['x-1', ''], "2nd"
assert checkio(['x*x*x+6*x*x+12*x+8', 'x+2']) == ['x*x+4*x+4', ''], "3rd"
assert checkio(['x*x*x*x*x+5*x+1', 'x*x']) == ['x*x*x', '5*x+1'], "4th"
结果:
>>> ================================ RESTART ================================ >>> x*x*x-12*x*x-42 / x-3 = ['x*x-9*x-27', '-123'] x*x*x-12*x*x-42 / x-3 = ['x*x-9*x-27', '-123'] x*x-1 / x+1 = ['x-1', ''] x*x*x+6*x*x+12*x+8 / x+2 = ['x*x+4*x+4', ''] x*x*x*x*x+5*x+1 / x*x = ['x*x*x', '5*x+1'] >>>
No comments :
Post a Comment