Python:解一元二次方程(带分数和根号结果)2.0X

文章介绍了一个Python程序,用于解一元二次方程,支持整数、分数和带根号的结果。程序通过辗转相除法计算最大公因数,进行约分处理,避免了如2/2这样的非必要结果。同时,程序优化了根号下的数,处理了可开根数的情况。代码包括最大公因数函数、约分函数和格式化输出函数,以及主函数,能够根据输入的方程系数给出解。
摘要由CSDN通过智能技术生成

之前的解方程的功能可以出现整数,分数,带根号的结果,但会有一个小bug,就是会出现类似于2/2的奇葩结果解方程1.0X在完善这个结果的同时,解决了根号下的数还有可以提出的可开根数。这也多亏了达达同志的鼎力相助!

Python:解一元二次方程(带分数和根号结果!)2.0X

原理

使用的最普通的求根公式,然后分情况讨论

建立的函数

有求最大公因数的函数gcb,求三个数的最大公因数的函数func,约分函数num_type,判断数是否为一func2,以及格式化的显示自创的分数和根号的输出函数solve

最大公因数

用的是经典的辗转相除法,考虑到系数可能为负数,输出时套了绝对值函数abs,方便后续使用正公因数。

def gcd(a, b):  #求最大正公因数
    if a == b:
        return a
    elif a < b:
        return gcd(b, a)
    else:
        while b != 0:
            a, b = b, a % b
        return abs(a)

三个数公因数

创建一个数组,加入三个数相互组合的公因数,再返回最小的那个,即为三个数的最大公因数

def func(a, b, c):  #求三个数的最大公因数
    list = []
    list += [gcd(a, b), gcd(a, c), gcd(b, c)]
    return(min(list))

约分

num1和num2代表分子和分母,分四种情况,分别是
1:分子分母相等返回1
2:分子分母约分不了返回分子(换行)-------(换行)分母
3:分子为最大公因数返回1(换行)------分母/分子
4:分母为最大公因数返回分子/分母

def num_type(num1, num2):  #约分
    if num1 == num2:
        return(1) 
    elif gcd(num1, num2) == 1:
        return(f"     {num1}\n       -------\n          {int(num2)}")
    elif gcd(num1, num2) == num1:
        return(f"     1\n       -------\n          {int(num2/num1)}")
    elif gcd(num1, num2) == num2:
        return(f"{int(num1/num2)}")

判断

主要是为了避免出现(1+1✓2)这种情况的出现,调用此函数就可以转变为(1+✓2)

def func2(num):  #判断数字是否为1
    if num == 1:
        return("")
    else:
        return(int(num))

格式化输出

额。。。自个儿看吧

def solve(num, b, a0):
    num_sqr = [i for i in range(2, int(sqrt(num))+1)]
    list = []
    for j in num_sqr:
        if num % j**2 == 0:
            list.append(j)
    if len(list) != 0:
        Max = max(list)
        if func(Max, b, a0) == 1:
            print(f"    {-b} + {func2(Max)} √ {int(num/Max**2)}\nX1 =-------\n      {a0}\n")
            print(f"    {-b} - {func2(Max)} √ {int(num/Max**2)}\nX2 =-------\n      {a0}\n")
        elif func(Max, b, a0) == a0:
            print(f"    {int(-b/func(Max, b, a0))} + {func2(Max/func(Max, b, a0))} √ {int(num/Max**2)}")
            print(f"    {int(-b/func(Max, b, a0))} - {func2(Max/func(Max, b, a0))} √ {int(num/Max**2)}")
        elif func(Max, b, a0) == b or Max:
            m = min(b, Max)
            print(f"    {int(-b/m)} + {func2(Max/m)} √ {int(num/Max**2)}\nX1 =-------\n      {int(a0/m)}\n")
            print(f"    {int(-b/m)} - {func2(Max/m)} √ {int(num/Max**2)}\nX2 =-------\n      {int(a0/m)}\n")
    else:
        print(f"    {-b} + √{num}\nX1 =-------\n      {a0}\n")
        print(f"    {-b} - √{num}\nX2 =-------\n      {a0}\n")

主函数

用try…except来解决输入不是数字的问题
在系数a,b为0时有个性化的回复

print("解方程 aX^2 + bX +c = 0")
while True:
    try:
        a = int(input("请输入 a 的值(自行转化为整数) : "))
        b = int(input("请输入 b 的值(自行转化为整数) : "))
        c = int(input("请输入 c 的值(自行转化为整数) : "))
        break
    except ValueError:
        print("您输入的不是数字,请再次尝试输入!")

d = b ** 2 - a * c * 4  # 判断δ情况
a0 = 2 * a

if a == 0:
    input("你好好看看这是不是一元二次方程!")

elif b == 0:
    input("这你都不会算你还上什么学?")

elif d < 0:
    print("此方程无实数根")

elif d == 0:
    print(f"此方程有两个相同的实数根,为{num_type(-b, a0)}")

elif d > 0:
    print("此方程有两个实数根")
    if sqrt(d) == int(sqrt(d)):  #当δ为能开尽时
        s1 = -b + sqrt(d)
        s2 = -b - sqrt(d) 
        print(f"X1 = {num_type(s1, a0)}\n")  # 方程的根1
        print(f"X2 = {num_type(s2, a0)}\n")  # 方程的根2

   elif sqrt(d) != int(sqrt(d)):  #当δ开不尽时
        solve(d, b, a0)

input('按enter键退出')

源代码

from math import sqrt


def gcd(a, b):  #求最大正公因数
    if a == b:
        return a
    elif a < b:
        return gcd(b, a)
    else:
        while b != 0:
            a, b = b, a % b
        return abs(a)

def func(a, b, c):  #求三个数的最大公因数
    list = []
    list += [gcd(a, b), gcd(a, c), gcd(b, c)]
    return(min(list))


def num_type(num1, num2):  #约分
    if num1 == num2:
        return(1) 
    elif gcd(num1, num2) == 1:
        return(f"     {num1}\n       -------\n          {int(num2)}")
    elif gcd(num1, num2) == num1:
        return(f"     1\n       -------\n          {int(num2/num1)}")
    elif gcd(num1, num2) == num2:
        return(f"{int(num1/num2)}")

def func2(num):  #判断数字是否为1
    if num == 1:
        return("")
    else:
        return(int(num))
    
def solve(num, b, a0):
    num_sqr = [i for i in range(2, int(sqrt(num))+1)]
    list = []
    for j in num_sqr:
        if num % j**2 == 0:
            list.append(j)
    if len(list) != 0:
        Max = max(list)
        if func(Max, b, a0) == 1:
            print(f"    {-b} + {func2(Max)} √ {int(num/Max**2)}\nX1 =-------\n      {a0}\n")
            print(f"    {-b} - {func2(Max)} √ {int(num/Max**2)}\nX2 =-------\n      {a0}\n")
        elif func(Max, b, a0) == a0:
            print(f"    {int(-b/func(Max, b, a0))} + {func2(Max/func(Max, b, a0))} √ {int(num/Max**2)}")
            print(f"    {int(-b/func(Max, b, a0))} - {func2(Max/func(Max, b, a0))} √ {int(num/Max**2)}")
        elif func(Max, b, a0) == b or Max:
            m = min(b, Max)
            print(f"    {int(-b/m)} + {func2(Max/m)} √ {int(num/Max**2)}\nX1 =-------\n      {int(a0/m)}\n")
            print(f"    {int(-b/m)} - {func2(Max/m)} √ {int(num/Max**2)}\nX2 =-------\n      {int(a0/m)}\n")
    else:
        print(f"    {-b} + √{num}\nX1 =-------\n      {a0}\n")
        print(f"    {-b} - √{num}\nX2 =-------\n      {a0}\n")

#主函数  
print("解方程 aX^2 + bX +c = 0")
while True:
    try:
        a = int(input("请输入 a 的值(自行转化为整数) : "))
        b = int(input("请输入 b 的值(自行转化为整数) : "))
        c = int(input("请输入 c 的值(自行转化为整数) : "))
        break
    except ValueError:
        print("您输入的不是数字,请再次尝试输入!")

d = b ** 2 - a * c * 4  # 判断δ情况
a0 = 2 * a

if a == 0:
    input("你好好看看这是不是一元二次方程!")

elif b == 0:
    input("这你都不会算你还上什么学?")

elif d < 0:
    print("此方程无实数根")

elif d == 0:
    print(f"此方程有两个相同的实数根,为{num_type(-b, a0)}")

elif d > 0:
    print("此方程有两个实数根")
    if sqrt(d) == int(sqrt(d)):  #当δ为能开尽时
        s1 = -b + sqrt(d)
        s2 = -b - sqrt(d) 
        print(f"X1 = {num_type(s1, a0)}\n")  # 方程的根1
        print(f"X2 = {num_type(s2, a0)}\n")  # 方程的根2

   elif sqrt(d) != int(sqrt(d)):  #当δ开不尽时
        solve(d, b, a0)

input('按enter键退出')

希望以上的代码能对你有所帮助,谢谢观阅!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值