C++ – 洛谷P1024 [NOIP2001 提高组] 一元三次方程求解

传参记得看变量类型

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也能跑,不是很懂。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注