欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

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

时间:2023-05-20
文章目录

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

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+dfor 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=" ")



过程理解

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。