老题新解|求一元二次方程

《信息学奥赛一本通》第52题:求一元二次方程

题目描述

利用公式 :
x 1 = − b + b 2 − 4 a c 2 a , x 2 = − b − b 2 − 4 a c 2 a x_1=\frac{-b+\sqrt{b^2-4ac}}{2a} , x_2=\frac{-b-\sqrt{b^2-4ac}}{2a} x1=2a−b+b2−4ac ,x2=2a−b−b2−4ac

求一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0 的根,其中 a a a 不等于 0 0 0。结果要求精确到小数点后 5 5 5 位。

输入格式

输入一行,包含三个浮点数 a , b , c a,b,c a,b,c(它们之间以一个空格分开),分别表示方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0 的系数。

输出格式

输出一行,表示方程的解。

若两个实根相等,则输出形式为:x1=x2=aaaa

若两个实根不等,在满足根小者在前的原则,则输出形式为:x1=aaaa;x2=bbbb

若无实根输出 No answer!

所有输出部分要求精确到小数点后 5 5 5 位,数字、符号之间没有空格。

输入输出样例 #1

输入 #1

-15.97 19.69 12.02

输出 #1

x1=-0.44781;x2=1.68075

大家好,我是莫小特。

这篇文章给大家带来《信息学奥赛一本通》中的第 52 题:求一元二次方程。

一、题目描述

洛谷的题号是:B2053 求一元二次方程

二、题意分析

这道题是信息学奥赛一本通练习题的第 52 题。

输入一行,包括三个浮点数 a、b、c,数据范围未说明,因此先试用 double 类型。

cpp 复制代码
double a,b,c;
cin>>a>>b>>c;

输入完成后,我们来分析题意,根据题目意思,要根据输入的三个浮点数来求一元二次防尘袋根,结果要精确到小数点后 5 位,题目中也给定了具体的计算公式,因此只需要将计算公式转换为程序语言即可。

考虑到都是小数,因此两个根也定义为 double 类型。

公式中有 b 2 − 4 a c \sqrt{b^2-4ac} b2−4ac ,需要用到 #include<camth> 头文件中的 sqrt() 函数。

cpp 复制代码
double x1=(-b+sqrt(b*b-4*a*c))/(2*a); 
double x2=(-b-sqrt(b*b-4*a*c))/(2*a); 

但这样不能直接输出,要根据输出格式的要求输出,即如果两个实根相等,要按样式输出 x1=x2=aaaa,如果没有实根,则输出 No answer!,所以不能简单的判断 x1 和 x2 的值,应该先判断是否有实根,根据一元二次方程的特点,想要判断是否存在实根,需要 ∆ 的值,也就是 b 2 − 4 a c b^2-4ac b2−4ac 的值,所以定义一个新的 double 变量存储 ∆ 的值。

cpp 复制代码
double detal=b*b-4*a*c;

如果 detal 变量的值小于 0,证明没有实根,输出 No answer!

cpp 复制代码
if(detal<0)
{
	cout<<"No answer!"; 
}

如果 detal 变量等于 0,证明两个实根相等,需要按要求的格式输出,并要精确到小数点后 5 位,精确到小数点后 5 位,使用 printf(%.5lf) 实现。

cpp 复制代码
else
{
	if(x1==x2)
	{
		printf("x1=x2=%.5lf",x1);
	}
}

剩下的只需要对 x1 和 x2 的值进行判断即可,如果 x1 大于 x2,则 x2 的值在前,如果 x1 小于 x2,则 x1 的值在前。

cpp 复制代码
else if(x1>x2) 
{
	printf("x1=%.5lf;x2=%.5lf",x2,x1);
}
else
{
	printf("x1=%.5lf;x2=%.5lf",x1,x2);
}

按照样例输入对数据进行验证。

符合样例输出,到网站提交测评。

测试通过!

三、完整代码

该题的完整代码如下:

cpp 复制代码
#include <iostream>
#include <bits/stdc++.h> 
using namespace std;
int main()
{
	double a,b,c;
	cin>>a>>b>>c;
	double x1=(-b+sqrt(b*b-4*a*c))/(2*a); 
	double x2=(-b-sqrt(b*b-4*a*c))/(2*a); 
	
	double detal=b*b-4*a*c;
	if(detal<0)
	{
		cout<<"No answer!"; 
	}
	else
	{
		if(x1==x2)
		{
			printf("x1=x2=%.5lf",x1);
		}
		else if(x1>x2) 
		{
			printf("x1=%.5lf;x2=%.5lf",x2,x1);
		}
		else
		{
			printf("x1=%.5lf;x2=%.5lf",x1,x2);
		}
	}
	return 0;
}

四、总结

本题是经典的公式转换,考察了以下知识点:

1、数学公式应用:熟练使用一元二次方程根公式

x 1 , 2 = − b ± b 2 − 4 a c 2 a x_{1,2}=\frac{-b\pm \sqrt{b^2-4ac}}{2a} x1,2=2a−b±b2−4ac

在使用时要保证变量都在 double 类型内,避免出现精度错误。

2、判别式计算,即 ∆ 的值。

Δ > 0 \Delta > 0 Δ>0 → 两个不等实根
Δ = 0 \Delta = 0 Δ=0 → 两个相等实根
Δ < 0 \Delta < 0 Δ<0 → 无实根

也就是以下公式:

cpp 复制代码
double delta = b*b - 4*a*c;

---end---

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!

如果有更好的方法也可以在评论区评论哦,我都会看哒~

我们下集见~

相关推荐
数据智能老司机3 分钟前
图算法趣味学——图着色
数据结构·算法·云计算
数据智能老司机12 分钟前
图算法趣味学——启发式引导搜索
数据结构·算法·云计算
John.Lewis35 分钟前
数据结构初阶(8)二叉树的顺序结构 && 堆
c语言·数据结构·算法
SimonSkywalke1 小时前
基于知识图谱增强的RAG系统阅读笔记(七)GraphRAG实现(基于小说诛仙)(一)
算法
程序猿编码1 小时前
基于LLVM的memcpy静态分析工具:设计思路与原理解析(C/C++代码实现)
c语言·c++·静态分析·llvm·llvm ir
猪蹄手1 小时前
C/C++基础详解(三)
开发语言·jvm·c++
再睡一夏就好2 小时前
【排序算法】④堆排序
c语言·数据结构·c++·笔记·算法·排序算法
再睡一夏就好2 小时前
【排序算法】⑥快速排序:Hoare、挖坑法、前后指针法
c语言·数据结构·经验分享·学习·算法·排序算法·学习笔记
martian6652 小时前
LeetCode算法领域经典入门题目之“Two Sum”问题
人工智能·算法·leetcode·医学影像