OpenJudge | 用二分法求方程的根

总时间限制: 1000ms 内存限制: 65536kB

描述

用二分法求下面方程在(-10, 10)之间的一个根。
2x3- 4x2+ 3x- 6 = 0

输入

一个小于1的非负实数e,它的值表示所能允许的误差

输出

一个实数,其值为求得的一个根,要求精确到小数点后8位。
若该区间上没有根,则输出“No Solution”

样例输入

0

样例输出

2.00000000

提示

对于一个连续函数f(x),若f(a)*f(b) <= 0,则f(x)在区间[a, b]内至少有一个根。
特别的,对于一个单调的连续函数,上述定理得逆定理也成立
若[a, b]上有根,则可进一步考察根是否在 [a, (a+b)/2]内,或者在[(a+b)/2, b]内。

若b-a <= e 则可终止迭代,并认为(a+b)/2是一个近似解,将它输出

请使用double类型!

Code

#include 
using namespace std;

double f(double x) {
	return 2.0*x*x*x-4.0*x*x+3.0*x-6.0;
}

void fun(double *left, double *mid, double *right) {
	if(f(*left)*f(*mid) <= 0.0) {
		*right = *mid;
		*mid = ((*left)+(*right))/2;
	} else {
		*left = *mid;
		*mid = ((*left)+(*right))/2;
	}
}

int main() {
	double left = -10, right = 10, mid = (left+right)/2;
	double e;
	scanf("%lf", &e);
	while(1) {
		fun(&left, &mid, &right);
		if(right-left <= e || right-left <= 0.000000001) {
			printf("%.8lf", mid);
			goto out;
		}
	}
	printf("No Solution");
	out:;
}

你可能感兴趣的:(#,openJudge,算法,openjudge)