C++ 解一元二次方程

还是老规矩:话不多说,先上代码。

#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
int main() {
	ld a,b,c,d,x1,x2,x;
	input:
	scanf("%llfx^2+%llfx+%llf=0",&a,&b,&c);
	if(a<=0) {
		cout<<"此方程输入有问题(a≤0),请重新输入!"<<endl;
		goto input; 
	}
	d=b*b-4*a*c;
	if(d>0) {
		cout<<"此方程有两个不等的实数解。"<<endl;
		cout<<"经过计算,得出以下结果:"<<endl;
		x1=(-b+sqrt(d))/(2*a);
		x2=(-b-sqrt(d))/(2*a);
		printf("x1=%.18Lf\nx2=%.18Lf\n",x1,x2);
		cout<<"您如果不想解方程了,请退出程序。"<<endl;
		cout<<"您如果还想解一个方程,请继续输入。"<<endl;
		goto input;
	}
	else if(d==0) {
		cout<<"此方程有两个相等的实数解。"<<endl;
		cout<<"经过计算,得出以下结果:"<<endl;
		x=(-b+sqrt(d))/(2*a);
		printf("x=%.18Lf\n",x);
		cout<<"您如果不想解方程了,请退出程序。"<<endl;
		cout<<"您如果还想解一个方程,请继续输入。"<<endl;
		goto input;
	}
	else if(d<0) {
		cout<<"经过计算,此方程没有实数解。"<<endl;
		cout<<"您如果不想解方程了,请退出程序。"<<endl;
		cout<<"您如果还想解一个方程,请继续输入。"<<endl;
		goto input;
	}
	return 0;
}

这次的代码质量还可以, 39 39 39 行代码。

C++ 中,一元二次方程通常涉及二次公式 \(ax^2 + bx + c = 0\) 的应用,其中 a、b 和 c 是给定的系数。要决这个问题,你需要先确定判别式 \(\Delta = b^2 - 4ac\),然后基于其值判断根的情况: 1. **实数根**: - 如果 \(\Delta > 0\),有两个不相等的实根:\(x_1 = \frac{-b + \sqrt{\Delta}}{2a}\) 和 \(x_2 = \frac{-b - \sqrt{\Delta}}{2a}\)。 - 如果 \(\Delta = 0\),有一个重复的实根:\(x_1 = x_2 = \frac{-b}{2a}\)。 - 如果 \(\Delta < 0\),方程无实根,但是有两个共轭复数根(包含虚部)。 2. **虚数根(复数根)**: 当判别式为负时,根的形式会涉及到虚数单位 i,即 \(x = \frac{-b \pm \sqrt{-\Delta}i}{2a}\),其中 \(\sqrt{-\Delta} = \sqrt{|-\Delta|} \cdot e^{i\pi / 4}\) 或 \(e^{i(3\pi / 4)}\),取决于你选择正还是负四分之一的圆周角。 以下是一元二次方程的一个简单示例,假设你已经有了一个名为 `quadratic_solver` 的函数,它接收 a、b 和 c 作为参数并返回一个 `std::pair` 结构体,表示两个可能的(一个可能是虚数): ```cpp #include <iostream> #include <complex> // 函数原型,返回一个包含可能的 pair template<typename T> std::pair<T, T> quadratic_solver(T a, T b, T c); int main() { double a, b, c; std::cout << "请输入一元二次方程的系数 (a, b, c): "; std::cin >> a >> b >> c; // 检查是否需要处理虚数情况 double discriminant = b * b - 4 * a * c; if (discriminant >= 0) { auto roots = quadratic_solver<double>(a, b, c); double real_root = roots.first; double imaginary_root = roots.second; // 这里假设是一个复数对 std::cout << "实数根: " << real_root << " 和 " << imaginary_root << std::endl; } else { complex<double> root1 = quadratic_solver(complex<double>(a, 0), b, c); complex<double> root2 = quadratic_solver(complex<double>(a, 0), b, c); // 双重虚根 std::cout << "复数根: (" << root1.real() << ", " << root1.imag() << ") 和 (" << root2.real() << ", " << root2.imag() << ")" << std::endl; } return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值