之前的解方程的功能可以出现整数,分数,带根号的结果,但会有一个小bug,就是会出现类似于2/2的奇葩结果解方程1.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键退出')
希望以上的代码能对你有所帮助,谢谢观阅!