P1024 [NOIP2001 提高组] 一元三次方程求解 – 洛谷 | 计算机科学教育新生态
其实是个平平无奇的简单二分,但是一个点卡了我快一刻钟,故记录
原代码
#include <iostream>
using namespace std;
double a,b,c,d;
int cnt=0;
double solve(double x){
return a*x*x*x+b*x*x+c*x+d;
}
double div(double n,double m){
if(m-n<=0.001) return m;
double mid=(n+m)/2;
if(solve(mid)*solve(n)<0){
return div(n,mid);
}else{
return div(mid,m);
}
}
int main(){
cin>>a>>b>>c>>d;
for(int i=-100;i<=100;i++){
if(cnt==3) break;
if(solve(i)==0){
printf("%.2f ",(double)i);
cnt++;
}
if(solve(i)*solve(i+1)<0){
printf("%.2f ",div(i,i+1));
cnt++;
}
}
return 0;
}
C++看着没什么问题,ide也没报错,但是一交oj就爆RE(Runtime Error. Received signal 8: Floating-point exception.)。查了很久解决方法也还是爆,然后仔细看了代码,把循环里的for(int i=-100;i<=100;i++)
改成了for(double i=-100;i<=100;i++)
就过了。传参记得看变量类型,警钟长鸣。
以及,调的过程中发现return div(n,mid);
这两句,没加return也能跑,不是很懂。