python 创建一个多项式类可以实现正负幂次,并对其进行显示,加减法,乘法

该博客介绍了如何创建一个Python类来表示和操作一种特殊形式的数据存储,其中数据存储为队列,项的指数遵循特定规律。类支持加法、减法和乘法运算,并能将多项式转换为字符串形式。博客提供了详细的代码实现和示例。
摘要由CSDN通过智能技术生成

数据存储模式是:生成一个队列,然后第一个数即P[0]是常数项,P[1],P[3],P[5]代表负幂次(P[1]是负一次幂,P[3]是负二次,P[5]是负三次,以此类推),P[2]是正1次,P[4]是正二次,所以有了数据结构编程就很容易了。

 

class P(object):
    def __init__(self,a):
        self.a=a
 
    def __add__(self,p):
        a,b=self.a, p.a
        if len(a)<len(b):
            weishu = len(b)
        else:
            weishu = len(a)
        c=[]
        for kkkk in range(weishu):
            c.append(0)
            if kkkk<len(a):
                if kkkk<len(b):
                    c[kkkk] = a[kkkk]+b[kkkk]
                else:
                    c[kkkk] = a[kkkk]
            else:
                c[kkkk] = b[kkkk]
        return P(c)
    def __sub__(self,p):
        a,b=self.a, p.a
        if len(a)<len(b):
            weishu = len(b)
        else:
            weishu = len(a)
        c=[]
        for kkkk in range(weishu):
            c.append(0)
            if kkkk<len(a):
                if kkkk<len(b):
                    c[kkkk] = a[kkkk]-b[kkkk]
                else:
                    c[kkkk] = a[kkkk]
            else:
                c[kkkk] = -b[kkkk]
        return P(c)


    def __mul__(self,p):
        a,b=self.a, p.a
        if len(a)==1:
            zuigaoci = len(b)
        if len(b)==1:
            zuigaoci = len(a)
        else:
            zuigaoci = len(a)+len(b)-1
        c = []
        for kkkk in range(zuigaoci):
            c.append(0)
        #考虑系数a[i],若其为i偶数,则其幂次为int(+i/2);
        #若其位奇数,则其幂次为int(-(i+1)/2)
        #幂次nn可以是0,负,正。
        #若幂次为正,则乘完之后放在nn*2
        #若幂次为负,则乘完之后放在-nn*2-1
        for i in range(len(a)):
            for j in range(len(b)):
                if i%2==0:
                    ni = round(i/2)
                else:
                    ni = round(-(i+1)/2)
                if j%2==0:
                    nj = round(j/2)
                else:
                    nj = round(-(j+1)/2)
                nn = ni+nj
                if nn > 0:
                    c[nn*2] += a[i]*b[j]
                if nn ==0:
                    c[0] += a[i]*b[j]
                if nn < 0:
                    c[-nn*2-1] += a[i]*b[j]                  
        return P(c)                             
    def _getStr(self,prefix='P(A) =',a=None):
        a = self.a
        aa = len(a)
        s = ''
        if len(a)==1:
            s+=str(a[0])
            return '{}{}'.format(prefix,s)
        if aa%2==0:
            zhengzuida = aa-2
            fuzuida = aa-1
            zhengweishu = round(aa/2)
            fuweishu = round(aa/2)
        else:
            zhengzuida = aa-1
            fuzuida = aa-2
            zhengweishu = round((aa-1)/2+1)
            fuweishu = round((aa-1)/2)
        #从正到负挨个排
        for i in range(zhengweishu-1):
            if a[zhengzuida-2*i]==0:
                continue
            else:
                if a[zhengzuida-2*i]>0:
                    s+=' +'
                else:
                    s+=' -'
                s+=str(abs(a[zhengzuida-2*i]))
                s+='A^'
                if (zhengzuida-2*i)%2==0:
                    s+=str( int((zhengzuida-2*i)/2))
                if (zhengzuida-2*i)%2==1:
                    s+=str( int(-(zhengzuida-2*i+1)/2))
        if a[0]!=0:
            if a[0]>0:
                s+=' +'+str(abs(a[0]))
            else:
                s+=' -'+str(abs(a[0]))
        for i in range(fuweishu):
            if a[2*i+1]==0:
                continue
            else:
                if a[(2*i+1)]>0:
                    s+=' +'
                else:
                    s+=' -'
                s+=str(abs(a[2*i+1]))
                s+='A^'
                if (2*i+1)%2==0:
                    s+=str( int(-(2*i+1)/2))
                if (2*i+1)%2==1:
                    s+='('+str( int(-(2*i+1+1)/2))+')'
        return '{}{}'.format(prefix,s)
    def Gettimes(n):
        if n%2==0:
            return n/2
        else:
            return -(n+1)/2
    def __str__(self):
        return self._getStr()

p1=P([1,2,3])
p2=P([0,1,0,1,-6,77,8])
p3=P([2,3,4,5])

print('p1:',p1)
print('p2:',p2)
print('p3:',p3)
print('p1+p2:',p1+p2)
print('p1-p2:',p1-p2)
print('p1*p3:',p1*p3)

输出结果:

p1: P(A) = +3A^1 +1 +2A^(-1)
p2: P(A) = +8A^3 -6A^2 +1A^(-1) +1A^(-2) +77A^(-3)
p3: P(A) = +4A^1 +2 +3A^(-1) +5A^(-2)
p1+p2: P(A) = +8A^3 -6A^2 +3A^1 +1 +3A^(-1) +1A^(-2) +77A^(-3)
p1-p2: P(A) = -8A^3 +6A^2 +3A^1 +1 +1A^(-1) -1A^(-2) -77A^(-3)
p1*p3: P(A) = +12A^2 +10A^1 +19 +22A^(-1) +11A^(-2) +10A^(-3)

还没有仔细检查错误,先这样吧。

参考了这个:https://zhidao.baidu.com/question/1051233755222477499.html

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值