https://www.luogu.com.cn/problem/P1024
方法一:暴力枚举
#include<bits/stdc++.h>
using namespace std;
double a, b, c, d, fx;
int main()
{
cin>>a>>b>>c>>d;
for(int i=-1000000; i<=1000000; i++){//根据数值范围放大,获得精度
double x=1.0*i/10000;//同比例缩小
fx=a*x*x*x+b*x*x+c*x+d;//函数值
//注意此处实数的精度比较,第一提交我写得是fx==0
结果只得了50分
if(abs(fx-0.0)<1e-6)cout<<fixed<<setprecision(2)<<x<<" ";//符合答案输出
}
return 0;
}
方法二:二分答案
#include<bits/stdc++.h> using namespace std; double a, b, c, d, fx; double f(double x){ return a*x*x*x+b*x*x+c*x+d; } double binaryseach(double l, double r){ while(l+1e-6<=r){//注意实数类型比较的精度控制 double mid=(r+l)/2; if(f(mid)==0)return mid; if(f(mid)*f(l)<0)r=mid; else if(f(mid)*f(r)<0) l=mid; } return l; } int main() { cin>>a>>b>>c>>d; for(double i=-100; i<100; i++){ //注意此处分两种情况讨论 if(f(i)*f(i+1.0)<0) cout<<fixed<<setprecision(2)<<binaryseach(i,i+1.0)<<" "; else if(f(i)==0) cout<<fixed<<setprecision(2)<<i<<" "; } return 0; }
同类型题练习:http://ybt.ssoier.cn:8088/problem_show.php?pid=1241
题解:
#include<bits/stdc++.h> using namespace std; double f(double x){ return x*x*x*x*x-15*x*x*x*x+85*x*x*x-225*x*x+274*x-121; } int main() { double l=1.5, r=2.4; double ans; bool b=0; //为了标记答案是否已经出现 while(l+1e-8<=r){ //注意实数类型比较的精度控制 double mid=(l+r)/2; if(f(mid)==0){ ans=mid; b=1; break; } if(f(mid)<0)r=mid; if(f(mid)>0)l=mid; } if(!b)ans=r; //答案没有出现,就求出近似值 printf("%.6lf",ans); return 0; }