**我试图让一个函数返回二次方程的结果,但我不知道如何将解打印为分数。请帮帮我!**
def cube_root(x):
return x**(1/3)
def Quadratic(a, b, c):
delta = (b**2)-4*a*c
if delta == 0:
x = (-b)/2*a
return f"This Quadratic equation has 1 solution: {x}"
else:
if delta < 0 :
return "This Quadratic equation has no solutions: "
else:
x1 = ((-b)-cube_root(delta))/2*a
x2 = ((-b)+cube_root(delta))/2*a
return f"This Quadratic equation has 2 solutions: {x1} & {x2}"
print(Quadratic(12, 0, -1))发布于 2020-08-04 19:50:34
您可以使用sympy包中的simplify (不在标准库中-您必须安装它):
from sympy import simplify, sqrt
def quadratic(a, b, c):
a = simplify(a) # convert inputs into objects used by simplify
b = simplify(b)
c = simplify(c)
delta = (b**2)-4*a*c
if delta == 0:
x = (-b)/2*a
return f"This Quadratic equation has 1 solution: {x}"
elif delta < 0 :
return "This Quadratic equation has no real solutions: "
else:
x1 = ((-b)-sqrt(delta))/2*a # using sqrt from sympy
x2 = ((-b)+sqrt(delta))/2*a
return f"This Quadratic equation has 2 solutions: {x1} & {x2}"
print(quadratic(12, 0, -1))这提供了:
This Quadratic equation has 2 solutions: -24*sqrt(3) & 24*sqrt(3)不同示例:
print(quadratic(12, 2, -1))提供:
This Quadratic equation has 2 solutions: -12*sqrt(13) - 12 & -12 + 12*sqrt(13)实际上,sympy还可以为您处理复数,因此您可以摆脱没有实际解决方案的测试(即删除elif,以便delta < 0由else:块处理)。
如果你这样做,然后给它一个例子:
print(quadratic(12, 2, 1))你会得到:
This Quadratic equation has 2 solutions: -12 - 12*sqrt(11)*I & -12 + 12*sqrt(11)*I发布于 2020-08-04 20:40:32
如果你不想要额外的包,也许下面的代码会有帮助:
from fractions import Fraction
def is_square(x):
if x < 0: return False
s = int(x**0.5)
return s*s == x
def sqrt_frac_str(frac):
if frac < 0:
return f'i {sqrt_frac_str(-frac)}'
num_isq = is_square(frac.numerator)
den_isq = is_square(frac.denominator)
if num_isq and den_isq:
return f'{int(frac.numerator**0.5)}/{int(frac.denominator**0.5)}'
elif num_isq:
return f'{int(frac.numerator**0.5)}/sqrt({frac.denominator})'
elif den_isq:
return f'sqrt({frac.numerator})/{int(frac.denominator**0.5)}'
else:
return f'sqrt({frac})'
def quadratic_frac(a, b, c):
delta = Fraction(b**2 - 4 * a * c)
rootcenter = Fraction(-b, 2 * a)
rootdeltasq = delta / Fraction(2 * a)**2
return rootcenter, rootdeltasq
def quadsol_str(rootcenter, rootdeltasq):
return f'{rootcenter} +/- {sqrt_frac_str(rootdeltasq)}'测试:
rc, rd = quadratic_frac(2, 1, -1)
rc, rd
# (Fraction(-1, 4), Fraction(9, 16))
quadsol_str(*quadratic_frac(2, 1, -1))
# '-1/4 +/- 3/4'
quadsol_str(*quadratic_frac(2, 0, -1))
# '0 +/- 1/sqrt(2)'
quadsol_str(*quadratic_frac(2, 0, 1))
# '0 +/- i 1/sqrt(2)'
quadsol_str(*quadratic_frac(3, 2, -1))
# '-1/3 +/- 2/3'
quadsol_str(*quadratic_frac(5, 3, -7))
# '-3/10 +/- sqrt(149)/10'https://stackoverflow.com/questions/63245926
复制相似问题