• 二分法求多项式单根


    在这里插入图片描述
    在这里插入图片描述

    输出格式:

    在一行中输出该多项式在该区间内的根,精确到小数点后2位。

    输入样例:

    3 -1 -3 1
    -0.5 0.5

    输出样例:

    0.33

    idea

    • 精确到小数点后两位
      =>阈值为0.001

    solution1

    #include 
    #include 
    double f(double a[], double x);
    int main(){
    	double arr[4], a, b;
    	for(int i = 0; i < 4; i++)
    		scanf("%lf", arr + i);
    	scanf("%lf%lf", &a, &b);
    	while(b - a > 0.001 && f(arr, b)*f(arr, a) <= 0){
    		if(f(arr, b) == 0){
    			printf("%.2f", b);
    			return 0;
    		}
    		else if(f(arr, a) == 0){
    			printf("%.2f", a);
    			return 0;
    		}
    		else{
    			double mid = (a + b) / 2;
    			if(f(arr, a)*f(arr, mid) < 0) b = mid;
    			else a = mid;
    		}
    	}
    	printf("%.2f", (a + b) / 2);
    	return 0;
    }
    
    double f(double a[], double x){
    	double ans = 0, power = 1;
    	for(int i = 3; i >= 0; i--){
    		ans += a[i]*power;
    		power *= x;
    	}
    	return ans;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    solution2

    #include 
    #include 
    double f(double a[], double x);
    int main(){
    	double arr[4], a, b, mid;
    	for(int i = 0; i < 4; i++)
    		scanf("%lf", arr + i);
    	scanf("%lf%lf", &a, &b);
    	while(b - a > 0.001){
    		mid = (a + b) / 2;
    		if(f(arr, mid) == 0) break;
    		else if(f(arr, a)*f(arr, mid) < 0) b = mid;
    		else a = mid;
    	}
    	printf("%.2f", (a + b) / 2);
    	return 0;
    }
    
    double f(double a[], double x){
    	double ans = 0, power = 1;
    	for(int i = 3; i >= 0; i--){
    		ans += a[i]*power;
    		power *= x;
    	}
    	return ans;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    solution3

    #include 
    double f(double a[], double x);
    int main(){
    	double arr[4], a, b, mid;
    	for(int i = 0; i < 4; i++)
    		scanf("%lf", arr + i);
    	scanf("%lf%lf", &a, &b);
    	while(b - a > 0.001){
    		mid = (a + b) / 2;
    		if(f(arr, mid) == 0) break;
    		else if(f(arr, a)*f(arr, mid) < 0) b = mid;
    		else a = mid;
    	}
    	printf("%.2f", (a + b) / 2);
    	return 0;
    }
    
    double f(double a[], double x){
    	return a[0]*x*x*x + a[1]*x*x + a[2]*x + a[3];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    MySQL基础(DDL、DML、DQL)
    IP路由的原理
    这几个高效软件简直是打工人的宝藏软件
    21天经典算法之直接插入排序
    前端,样式,行间距,字间距
    How to solve 0/1-QP by Gurobi
    CSS3常用的新功能总结
    【iOS逆向与安全】好用的一套 TCP 类
    计算机组成原理 期末复习笔记
    知识图谱04——openGL与ubuntu22.04
  • 原文地址:https://blog.csdn.net/Moliay/article/details/133902355