02707: 求一元二次方程的根
math, http://cs101.openjudge.cn/practice/02707
利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax^2^ + bx + c =0的根,其中a不等于0。
输入
第一行是待解方程的数目n。 其余n行每行含三个浮点数a, b, c(它们之间用空格隔开),分别表示方程ax^2…… + bx + c =0的系数。
输出
输出共有n行,每行是一个方程的根: 若是两个实根,则输出:x1=...;x2 = ... 若两个实根相等,则输出:x1=x2=... 若是两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i
所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。 x1和x2的顺序:x1的实部>Re的实部||(x1的实部==x2的实部&&x1的虚部>=x2的虚部)
样例输入
3
1.0 3.0 1.0
2.0 -4.0 2.0
1.0 2.0 8.0样例输出
x1=-0.38197;x2=-2.61803
x1=x2=1.00000
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i提示
1、需要严格按照题目描述的顺序求解x1、x2。 2、方程的根以及其它中间变量用double类型变量表示。 3、函数sqrt()在头文件math.h中。 4、要输出浮点数、双精度数小数点后5位数字,可以用下面这种形式:
printf("%.5f", num);
注意,在使用Java做此题时,可能会出现x1或x2等于-0的情形,此时,需要把负号去掉
来源
2005~2006医学部计算概论期末考试
OJ平台,浮点数计算有问题。例如:02707:求一元二次方程的根,http://cs101.openjudge.cn/practice/02707
如果输入数据是 8 7.65 9,则
但是如果
实部保留5位小数 print(f'{x1.real:.5f}'),得到 -0.47812
这类题目不建议做,因为平台有问题。
import math
n = int(input())
for i in range(n):
a, b, c = map(float, input().split())
if b == 0:
b = -b
delta = b ** 2 - 4 * a * c
if delta > 0:
x1 = (-b + math.sqrt(delta)) / (2 * a)
x2 = (-b - math.sqrt(delta)) / (2 * a)
print(f"x1={x1:.5f};x2={x2:.5f}")
elif delta == 0:
t = (-b) / (2 * a)
print(f"x1=x2={t:.5f}")
else:
d = math.sqrt(-delta) / (2 * a)
re = (-b) / (2 * a)
print(f"x1={re:.5f}+{d:.5f}i;x2={re:.5f}-{d:.5f}i")import math
n = int(input())
for i in range(n):
a, b, c = map(float, input().split())
if b == 0:
b = -b
delta = b ** 2 - 4 * a * c
if delta > 0:
x1 = (-b + math.sqrt(delta)) / (2 * a)
x2 = (-b - math.sqrt(delta)) / (2 * a)
x1 = format(x1, ".5f")
x2 = format(x2, ".5f")
print(f"x1={x1};x2={x2}")
elif delta == 0:
t = (-b) / (2 * a)
x1 = format(t, ".5f")
print(f"x1=x2={x1}")
else:
d = format(math.sqrt(-delta) / (2 * a), ".5f")
re = format((-b) / (2 * a), ".5f")
print(f"x1={re}+{d}i;x2={re}-{d}i")