Python求一元二次方程的根

题目要求:

本题目要求读入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) )
  • 11
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值