天梯赛练习 7-4 求一元二次方程的根

本题目要求一元二次方程的根,结果保留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 

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;
}

你可能感兴趣的:(数学,模拟)