【PAT】3-1 二分法求多项式单根
二分法的步骤为:
检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a, (a+b)/2],令b=(a+b)/2,重复循环;
#include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <string> #include <cstring> #include <cmath> #include <ctime> #include <set> using namespace std; #define read() freopen("data.in", "r", stdin) #define write() freopen("data.out", "w", stdout) #define clr( a , x ) memset ( a , x , sizeof a ) #define cpy( a , x ) memcpy ( a , x , sizeof a ) #define _max(a,b) ((a>b)?(a):(b)) #define _min(a,b) ((a<b)?(a):(b)) #define LL long long const int maxNumber=10002; double a3,a2,a1,a0; double f(double x) { double sum; sum = pow(x,3)*a3+pow(x,2)*a2+a1*x+a0; return sum; } int main() { //read(); double a,b; double mid; cin>>a3>>a2>>a1>>a0>>a>>b; while(b-a >= 0.001)//因为精度要求是两位,那就保证最后的解在小数点后第三位精确就行 { mid = (a+b)/2; if (f(mid) == 0) { break; }else if (f(a)*f(mid) < 0) { b = mid; }else { a = mid; } } mid = (a+b)/2; printf("%.2f\n",mid ); return 0; }