本题目要求一元二次方程的根,结果保留2位小数。
输入格式:
输入在一行中给出3个浮点系数a、b、c,中间用空格分开。
输出格式:
根据系数情况,输出不同结果:
1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;
3)如果方程只有一个根,则直接输出此根;
4)如果系数都为0,则输出"Zero Equation";
5)如果a和b为0,c不为0,则输出"Not An Equation"。
做题收获:当浮点数为一个极小的负数时,四舍五入之后会输出-0.00,所以需要设定一个误差值,当结果abs(x) < 0.005时,强制令x = 0,这样就不会出现输出-0.00的情况了。
还有就是c语言的’=‘符号是存在误差的(误差范围不固定,虽然本题用’='就能通过了),使用abs(x) < 1e-16之类的语句,可以用来把误差控制在给定范围。
代码:
#include <bits/stdc++.h>
using namespace std;
const double e = 5e-3 , dt = 1e-16;
int main() {
double a , b , c;
double res1 , res2;
scanf("%lf %lf %lf" , &a , &b , &c);
if(!a && !b && !c) {
cout << "Zero Equation\n";
}
else if(!a && !b && c) {
cout << "Not An Equation\n";
}
else if(!a) {
double res1 = (-1) * c / b;
if(abs(res1) < e)res1 = 0;
printf("%.2f\n", res1);
}
else {
double t = b * b - 4 * a * c;
if(abs(t) < e) {
res1 = (-1) * b / (2 * a);
if(abs(res1) < e)res1 = 0;
printf("%.2f\n", res1);
}
else if(t > 0){
res1 =( (-1) * b + sqrt(t) ) / (2 * a);
res2 =( (-1) * b - sqrt(t) ) / (2 * a);
if(res1 < res2)swap(res1 , res2);
if(abs(res1) < e)res1 = 0;
if(abs(res2) < e)res2 = 0;
printf("%.2f\n%.2f\n" , res1 , res2);
}
else if(t < 0){
res1 = ( (-1) * b / (2 * a) );
t = -t;
res2 = abs( sqrt(t) ) / (2 * a);
if(abs(res1) < e)res1 = 0;
if(abs(res2) < e)res2 = 0;
printf("%.2f+%.2fi\n",res1 , res2);
printf("%.2f-%.2fi\n",res1 , res2);
}
}
return 0;
}