- C++
香暴力&臭二分
- @ 2025-12-14 15:52:58
原题地址 我的代码: 二分
#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 条评论
-
向钲旭 @ 2026-2-1 15:13:48Haha......
-
@ 2026-1-10 19:30:49《臭狗熊和香光头》
- 1