原题地址 我的代码: 二分

#include <stdio.h>
using namespace std;
double ans[3];
int cnt;
double a;
double b;
double c;
double d;
double check(double root) {
	return a * root * root * root + b * root * root + c * root + d;
}
double bin(double left, double right) {
	while (right - left > 0.000001) {
		double mid = (left + right) / 2.0;
		if (check(mid) == 0) {
			return mid;
		} else if (check(left) * check(mid) < 0) {
			right = mid;
		} else {
			left = mid;
		}
	}
	return (left + right) / 2.0;
}
int main() {
	/* 有形如:ax^3+bx^2+cx+d=0这样的一个一元三次方程。 
	(a,b,c,d 均为实数),
	(根的范围在 −100 至 100 之间)
	一行,4 个实数 a,b,c,d。
	一行,3 个实根,
	从小到大输出,
	并精确到小数点后 2 位。 */
	scanf("%lf", &a);
	scanf("%lf", &b);
	scanf("%lf", &c);
	scanf("%lf", &d);
	for (double i = -100.0; i < 100.0; i++) {
		if (check(i) > -0.000001 && check(i) < 0.000001) {
			ans[cnt] = i;
			cnt++;
		} else if (check(i) * check(i + 1.0) < 0) {
			ans[cnt] = bin(i, i + 1.0);
			cnt++;
		}
	}
	if (check(100.0) > -0.000001 && check(100.0) < 0.000001) {
		ans[cnt] = 100.0;
		cnt++;
	}
	for (int i = 0; i < cnt; i++) {
		printf("%.2lf ", ans[i]);
	}
	return 0;
}

暴力

#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;
double check(double root){
  return a*root*root*root+b*root*root+c*root+d;
}
int main(){
  cin>>a>>b>>c>>d;
  for(double i=-100.0;i<=100.0;i+=1e-2)if(fabs(check(i))<=1e-2)printf("%.2lf ",i);
  return 0;
}

11行的香暴力代码全部测试点AC,然而臭二分只过了2个点,50分,二分浮点数精度控制太难了!!!

2 条评论

  • 1