Python解一元一次方程和一元二次方程,输出数学形式和小数形式

Python解一元一次方程和一元二次方程,输出数学形式和小数形式


创建函数:

def eqt(c,b,a=0):

其中,a、b、c分别是二次项系数、一次项系数和常数项,a==0时即为一元一次方程。输入的a、b、c可能是整数、浮点数或复数。当其都属于整数或浮点数时,还需要以化简后的数学形式输入计算结果;若存在复数时,或输出结果为复数时,不输出数学形式。

一元一次方程

为输出化简后的数学形式,需要先将输入值浮点数化成整数:

def intoint(numlist,k):
    def isint(numlist):
        intornot = True
        for num in numlist:
            if num != int(num):
                intornot = False
        return intornot
    while isint(numlist) == False:
        numlist = [num * k for num in numlist]
    return numlist

将输入的numlist中每一个数同时乘以k(一般是10,在一元二次方程中判别式化简时为100),直到小数点后均为0为止。

infl = (int, float)
if a == 0:
    if type(c) in infl and type(b) in infl:
        cblist = intoint([c, b], 10)
        c, b = int(cblist[0]), int(cblist[1])
        mcf = maxcf([abs(c), abs(b)])
        c, b = int(c / mcf), int(b / mcf)
        xx = '-' if c / b > 0 else ''
        c, b = str(abs(c)), str(abs(b))
        xx += c + '/' + b if b != '1' else c
        x = eval(xx)
        return [xx, x]
    else:
        x = -c/b
        return [None, x]

先判断输入值中是否含有复数,若有,则直接输出小数形式-c/b,若无,则先将浮点数化为整数,再同除以最大公因数以化简。这里用到了求多个整数的最大公因数的maxcf函数,详见Python求多个数的最大公因数(HCF)和最小公倍数(LCM)。再判断结果的正负和是否b==1b==1时省略分数线和分母。输出结果中,xx是字符串形式的数学表达式,x是小数形式的计算结果。

一元二次方程

else:
	dlt = b**2-4*a*c
    if type(c) in infl and type(b) in infl and type(a) in infl and dlt >= 0:
        dlk, dlt0 = 1, dlt
        intdlt = intoint([dlt], 100)[0]
        dlr = dlt = int(intdlt)
        dltpflist = pf(dlt)[1]
        t = 2
        for tt in range(1,len(dltpflist)):
            if dltpflist[tt] == dltpflist[tt-1]:
                t += 1
            else:
                t = 2
            if t == 3:
                dlk = int(dlk * dltpflist[tt])
                dlr = int(dlr / dltpflist[tt] ** 2)
                t = 1
        dlk = dlk / (intdlt / dlt0) ** 0.5 if dlt0 > 0 else 0
        aa = a * 2
        bdalist = intoint([b, dlk, aa], 10)
        b, dlk, aa = int(bdalist[0]), int(bdalist[1]), int(bdalist[2])
        mcf = maxcf([abs(b), abs(dlk), abs(aa)])
        b, dlk, aa = int(b / mcf), int(dlk / mcf), int(aa / mcf)
        if dlr == 1 or dlr == 0:
            def dlr1xx(n,inputaa):
                nalist = intoint([n, inputaa], 10)
                n, aa1 = int(nalist[0]), int(nalist[1])
                mcf = maxcf([abs(n), abs(aa1)])
                n, aa1 = int(n / mcf), int(aa1 / mcf)
                xx = '-' if n / aa1 < 0 else ''
                n, aa1 = str(abs(n)), abs(aa1)
                xx += n + '/' + str(aa1) if aa1 != 1 else n
                return xx
            if dlr == 0:
                dlk = 0
            xx1 = dlr1xx(-b+dlk,aa)
            xx2 = dlr1xx(-b-dlk,aa)
        else:
            if b / aa < 0:
                xx1 = xx2 = '('
            elif b / aa > 0:
                xx1 = xx2 = '-('
            elif b == 0 and aa > 0:
                xx1, xx2 = '(', '-('
            else:
                xx1, xx2 = '-(', '('
            dltype = ['+', '-'] if b < 0 else ['-', '+']
            b, aa, dlr, dlk = str(abs(b)), str(abs(aa)), str(dlr), str(dlk)
            if b != '0':
                xx1 += b + dltype[0]
                xx2 += b + dltype[1]
            if dlk != '1':
                xx1 += dlk + '*'
                xx2 += dlk + '*'
            xx1 += dlr + '**0.5)'
            xx2 += dlr + '**0.5)'
            if aa != '1':
                xx1 += '/' + aa
                xx2 += '/' + aa
        x1, x2 = eval(xx1), eval(xx2)
        return [dlt0, xx1, xx2, x1, x2]
    else:
        x1 = (-b+(dlt)**0.5)/(2*a)
        x2 = (-b-(dlt)**0.5)/(2*a)
        return [dlt, None, None, x1, x2]

先判断输入的a、b、c是否均为整数或浮点数,若存在复数,则直接计算结果;若均为浮点数或整数且判别式非负,即dlt>=0,则需先得到数学表达式。
先将判别式通过intoint([dlt], 100)[0]转化为整数形式,注意已翻倍的需在根号外除回。再将判别式化为最简形式,用到了pf函数求其质因数,详见Python判断质数合数,质因数分解并得到所有因数。将根号外的系数设为dlk,根号内的数为dlraa = a * 2。对b、dlk、aa三个数化为整数后同时除以最大公因数得到最简形式。当dlr == 1 or dlr == 0时,不需要保留根号。判断输出结果的正负,以及b是否为0,aa是否为1,dlk是否为1,分别处理,输出结果。返回的列表中,第一项是判别式的值(初始值),第二、三项是两个解的数学表达式(输入存在复数或判别式为负时为None),第四、五项是两个解的小数形式。

完整代码

def eqt(c,b,a=0):
    def intoint(numlist,k):
        def isint(numlist):
            intornot = True
            for num in numlist:
                if num != int(num):
                    intornot = False
            return intornot
        while isint(numlist) == False:
            numlist = [num * k for num in numlist]
        return numlist
    infl = (int, float)
    if a == 0:
        if type(c) in infl and type(b) in infl:
            cblist = intoint([c, b], 10)
            c, b = int(cblist[0]), int(cblist[1])
            mcf = maxcf([abs(c), abs(b)])
            c, b = int(c / mcf), int(b / mcf)
            xx = '-' if c / b > 0 else ''
            c, b = str(abs(c)), str(abs(b))
            xx += c + '/' + b if b != '1' else c
            x = eval(xx)
            return [xx, x]
        else:
            x = -c/b
            return [None, x]
    else:
        dlt = b**2-4*a*c
        if type(c) in infl and type(b) in infl and type(a) in infl and dlt >= 0:
            dlk, dlt0 = 1, dlt
            intdlt = intoint([dlt], 100)[0]
            dlr = dlt = int(intdlt)
            dltpflist = pf(dlt)[1]
            t = 2
            for tt in range(1,len(dltpflist)):
                if dltpflist[tt] == dltpflist[tt-1]:
                    t += 1
                else:
                    t = 2
                if t == 3:
                    dlk = int(dlk * dltpflist[tt])
                    dlr = int(dlr / dltpflist[tt] ** 2)
                    t = 1
            dlk = dlk / (intdlt / dlt0) ** 0.5 if dlt0 > 0 else 0
            aa = a * 2
            bdalist = intoint([b, dlk, aa], 10)
            b, dlk, aa = int(bdalist[0]), int(bdalist[1]), int(bdalist[2])
            mcf = maxcf([abs(b), abs(dlk), abs(aa)])
            b, dlk, aa = int(b / mcf), int(dlk / mcf), int(aa / mcf)
            if dlr == 1 or dlr == 0:
                def dlr1xx(n,inputaa):
                    nalist = intoint([n, inputaa], 10)
                    n, aa1 = int(nalist[0]), int(nalist[1])
                    mcf = maxcf([abs(n), abs(aa1)])
                    n, aa1 = int(n / mcf), int(aa1 / mcf)
                    xx = '-' if n / aa1 < 0 else ''
                    n, aa1 = str(abs(n)), abs(aa1)
                    xx += n + '/' + str(aa1) if aa1 != 1 else n
                    return xx
                if dlr == 0:
                    dlk = 0
                xx1 = dlr1xx(-b+dlk,aa)
                xx2 = dlr1xx(-b-dlk,aa)
            else:
                if b / aa < 0:
                    xx1 = xx2 = '('
                elif b / aa > 0:
                    xx1 = xx2 = '-('
                elif b == 0 and aa > 0:
                    xx1, xx2 = '(', '-('
                else:
                    xx1, xx2 = '-(', '('
                dltype = ['+', '-'] if b < 0 else ['-', '+']
                b, aa, dlr, dlk = str(abs(b)), str(abs(aa)), str(dlr), str(dlk)
                if b != '0':
                    xx1 += b + dltype[0]
                    xx2 += b + dltype[1]
                if dlk != '1':
                    xx1 += dlk + '*'
                    xx2 += dlk + '*'
                xx1 += dlr + '**0.5)'
                xx2 += dlr + '**0.5)'
                if aa != '1':
                    xx1 += '/' + aa
                    xx2 += '/' + aa
            x1, x2 = eval(xx1), eval(xx2)
            return [dlt0, xx1, xx2, x1, x2]
        else:
            x1 = (-b+(dlt)**0.5)/(2*a)
            x2 = (-b-(dlt)**0.5)/(2*a)
            return [dlt, None, None, x1, x2]

运行结果

>>> eqt(1, 2, 1)
[0, '-1', '-1', -1, -1]
>>> eqt(-11, 2.8, 1)
[51.839999999999996, '11/5', '-5', 2.2, -5]
>>> eqt(12, 44)
['-3/11', -0.2727272727272727]
>>> eqt(1j, 2j)
[None, (-0.5+0j)]
>>> eqt(4, 75, 2)
[5593, '-(75-5593**0.5)/4', '-(75+5593**0.5)/4', -0.05340940171176456, -37.44659059828824]
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值