题目要求:
本题目要求读入3个一元二次方程的系数a,b,c,求出该方程的根(也可能有复数根)。 解题提示:Python的 math模块 中 sqrt 函数求负数平方根会报错, 因为math 模块中 sqrt 函数只能进行浮点数的运算。我们知道负数的平方根是虚数(以及复数,即实数和虚数之和)。这个需要一个专门的函数 cmath (complex math,复数)的模块做处理。
输入格式:
输入在一行中给出3个系数,必须保证a不等于0,中间以英文逗号隔开。
输出格式:
delta=b*b-4ac,
(1) delta==0 则输出: x1=x2=value (value代表一个实数值,value值保留小数点后1位小数)
(2) delta>0 则输出: x1=value
x2=value (分两行输出,value代表一个实数值,value值保留小数点后2位小数)
(3) delta<0 则输出:
C1=real+imagj
C1=real- imagj
(分两行输出,real与imag表示复数的实部与虚部,保留小数点后3位小数)
输入样例:
1,2,3
输出样例:
C1=-1.000+1.414j
C2=-1.000-1.414j
问题分析:
-
做这道题没看过参考答案,最容易被忽视的就是没有考虑到输入是float类型的数
-
题目给的样例都是整数,而且没给出明确的类型提示,因此两次考察到这道题我都栽了跟头
-
解题的关键在于使用eval函数将输入自动转为pyhon相应的数据类型,以及对复数的计算和格式化
complex格式化
# 复数格式化两种方法:
s1 = complex(1.232341,3.14159265793)
# s1输出: (1.232341+3.14159265793j)
print("C1={0.real:.3f}{0.imag:+.3f}j".format(s1))
print("C1={:.3f}{:+.3f}j".format(s1.real, s1.imag))
eval函数
# eval函数将字符串转为数值类型
ss = eval(input())
# 类型:<class 'tuple'>
print(type(ss))
# 输入:1,2.345,0
# 对应类型:<class 'int'>,class 'float'>,<class 'int'>
代码实现:
import cmath
import math
a,b,c = eval(input())
delta=b * b - 4 * a * c
if delta==0:
print("x1=x2={:.1f}".format(-b/(2*a)))
elif delta>0:
sqrtdelta = math.sqrt(delta)
x1 = (-b + sqrtdelta) / (2 * a)
x2 = (-b - sqrtdelta) / (2 * a)
print("x1={:.2f}".format(x1))
print("x2={:.2f}".format(x2))
else:
sqrtdelta = cmath.sqrt(delta)
x1 = (-b + sqrtdelta) / (2 * a)
x2 = (-b - sqrtdelta) / (2 * a)
print("C1={0.real:.3f}{0.imag:+.3f}j".format(x1) )
print("C2={0.real:.3f}{0.imag:+.3f}j".format(x2) )