栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

6.3 有精度的二分法使用——【一元三次方程求解】

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

6.3 有精度的二分法使用——【一元三次方程求解】

文章目录

题目描述输入描述输出描述输入输出样例最终代码

1. c/c++2. java3. python 过程理解

题目描述

有形如:ax3+bx2 + cx + d =0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100 至 100 之间),且根与根之差的绝对值>1。

要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

输入描述

输入一行,4个实数a,b,c,d

输出描述

输出一行,3个实根,从小到大输出,并精确到小数点后2位。

输入输出样例

输入:

1 -5 -4 20

输出:

-2.00 2.00 5.00



最终代码 1. c/c++
#include 
using namespace std;
double a,b,c,d;
double y(double x){ return a*x*x*x+b*x*x+c*x+d;}
int main()
{
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);  //输入
    
    
    //题目说「根与根之差的绝对值≥1”,分为200个小区间
    for (int i=-100;i<100;i++)
    { 
        double left = i, right =i+1;
        double y1 = y(left), y2 = y(right);
        
        if(y1 == 0) printf("%.2lf ",left); //判断左端点。一个小坑
        
        
        //小区间内有根
        if(y1*y2 < 0)
        {  
           for(int j = 0; j<100; j++)
           {     //在小区间内二分
                double mid=(left+right)/2;
                if(y(mid)*y(right) <= 0)
                   left = mid;
                else
                   right = mid;
            }
            printf("%.2lf ",right);
        }
    }
    return 0;
}



2. java
import java.util.*;
public class Main{     // 暴力枚举
    public static void main(String[] args){
        Scanner rd =new Scanner(System.in);
        double a = rd.nextDouble();
        double b = rd.nextDouble();
        double c = rd.nextDouble();
        double d = rd.nextDouble();
        for(double i=-100;i<=100;i+=0.01)
            if(Math.abs(a*i*i*i+b*i*i+c*i+d) < 0.000001)
                System.out.printf("%.2f ",i);
        }
}



3. python
n = input().split()
a,b,c,d = eval(n[0]),eval(n[1]),eval(n[2]),eval(n[3])
def y(x):    
    return a*x*x*x+b*x*x+c*x+d
for i in range(-100,100):
    left=i
    right=i+1
    y1=y(left)
    y2=y(right)
    if y1==0:
        print("{:.2f}".format(left),end=" ")
    if y1*y2<0 :
        while (right-left) >= 0.001:    #eps=0.001
            mid = (left+right)/2
            if y(mid)*y(right) <=0:
                left = mid
            else:
                right = mid
        print("{:.2f}".format(right),end=" ")



过程理解

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/740753.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号