题目描述输入描述输出描述输入输出样例最终代码
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++
#includeusing 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=" ")
过程理解



