蓝桥之路——解方程

蓝桥杯必备知识点——解方程

对于想要参加蓝桥杯的小伙伴们,需要掌握快速简易的解方程的方法,今天,我们可以聊一下常用的关于C/C++的常用解方程之法。
首先,我们先来看一个例子:
蓝桥之路——解方程_第1张图片

首先,对于没有时间限制要求的题目,最简便的方法就是暴力求解,同时这也是一个效率极低,十分耗时的方法,优点是简单易记。

暴力法无非就是将所有可能一一列举,取其符合的值,如下

​#include 

double a, b, c, d;
double f(double x)
{
	return a*x*x*x+b*x*x+c*x+d;
}

int main(void)
{
	scanf("%lf %lf %lf %lf", &a, &b, &c, &d);
	double i;
	for(i=-100; i<=100; i+=1e-4)	//此处1e-4并非固定的值,看情况取,要求比精确度更小!
		if(f(i)*f(i+1e-4)<0)		//同上
			printf("%.2f ", i);
	
	return 0;
 } ​

我们可以看得出来,暴力求解对新手极其友好,简短清晰。不过这种方法效率低,但我们可以对其稍加改进,采用二分确定精确取值

​#include 

double a, b, c, d;
double f(double x)
{
	return a*x*x*x+b*x*x+c*x+d;
}

//采用二分法取精确值,运用递归 
double g(double min, double max)
{
	if(max-min<1e-5)
		return min;
	double mid = (max+min)/2.0;		 
	if(f(mid)*f(max)<0)
		return g(mid, max);
	else
		return g(min, mid);
	
}
int main(void)
{
	scanf("%lf %lf %lf %lf", &a, &b, &c, &d);
	int i;
	for(i=-100; i<=100; ++i)  //题目讲明了两个根的绝对值之差不小于1,所以可以明确知道大小为1的区间内至多只有一个根
		if(f(i) == 0)
			printf("%.2f ", (double)i);	//由于 i 是整型,需要类型转换 
		else if(f(i)*f(i+1)<0)
			printf("%.2f ", g(i, i+1));
	
	return 0;
 } ​

我们可以明显看出,此方法过滤掉了许多不必要的求值,效率有所提高,但是明显缺点是代码量与暴力求解相比较大,我们可以根据实际情况再一步改进,得出最优解法。(此处不加以讨论)

接下来,我们再举一个例子
蓝桥之路——解方程_第2张图片

这是蓝桥杯校园选拔赛的一道真题,我们分析一下,这是一道填空题,所以对代码运行时间没有过多要求,而且只要求精确到小数点后6位,且划定了区间(2,3),计算量不算太大,为了避免错误,暴力求解最优,同时注意,题目有要求四舍五入,我们可以想到C++中fixed和setprecrision函数连用,代码如下:

​#include 
#include 
#include 

using namespace std;
int main()
{
	double x;
	for(x=2; x<=3; x+=1e-7)
	{
		if(fabs(pow(x, x)-10) < 1e-6)
			cout<

在这里插入图片描述

好了,总结起来,一般情况下,解方程的核心就是暴力枚举,当我们对它的效率有所要求时,我们可以通过二分法来提高效率,大家如果有不同见解,可以进行留言讨论,谢谢!O(∩_∩)O

你可能感兴趣的:(蓝桥之路——解方程)