一、题目
acm.wust.edu.cn/problem.php?id=1205&soj=0
二、分析
- 一元二次方程有三个系数a、b、c,两个根x1、x2,以及d(德尔塔);
- a、b、c均为实数,以及输出保留6位小数,全部定义为double类型;
- a、b、c均为0,退出并结束;
- 方程有两个根,从大到小输出,中间一个空格;
- 两根相同输出一个即可;
- 无解输出-1;
- 多组输入。
三、思路
计算d(德尔塔):
- d=0,x1=-b/(2*a),输出x1;
- d>0,x1=(-b+sqrt(d))/(2*a),x2=(-b-sqrt(d))/(2*a),用fmax,fmin函数,依次输出较大数,较小数;
- 否则,输出-1。
四、代码
#include<stdio.h>
#include<math.h>
int main() {
double a, b, c, d, x1, x2; // 三个系数,德尔塔,两个根
while (scanf("%lf%lf%lf", &a, &b, &c) != EOF) {
// 三个系数均为0,退出
if (a == 0 && b == 0 && c == 0) {
break;
}
d = b * b - 4 * a*c; // 计算德尔塔
if (d == 0) { // 一个根
x1 = -b / (2 * a);
printf("%lf
", x1);
}
else if (d > 0) { // 两个根
x1 = (-b + sqrt(d)) / (2 * a);
x2 = (-b - sqrt(d)) / (2 * a);
// 先输出较大的,再输出较小的
printf("%lf %lf
", fmax(x1, x2), fmin(x1, x2));
}
else { // 无解
printf("%d
", -1);
}
}
return 0;
}
五、截图
备注:注意第二组数据。