1つの変数の3次方程式を解く
アイデア:
この質問は二分法の質問票に含まれているため、暴力的な場合は二分法を使用します(数式を使用する巨人がいるようです。後でカンカンに行きます)。しかし、それを考えた後、233を分割する方法がわかりません(多分これが料理です)。ルートとルートの差の絶対値が> = 1であることがわかるまで、それは検索の間隔であることが判明しました...
実際、重要な点は、おそらく制御精度と間隔の境界です。
コードは、左の境界を判断し、2つのパーティション内で直接続行しようとします。もちろん、100が欠落していることがわかった場合は、100の特別な判断が行われます。
精度の鍵は二分法にあります。これは、左と右の間の最終距離が0.01未満になるため、upper_boundまたはlower_boundのどちらであるかを考慮する必要がないためです。直接ansは毎回左または右に切り替わります。
コード:
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;
double f(double x){
return a*x*x*x+b*x*x+c*x+d;
}
int main(){
int cnt=0;
double ans;
double l,r,m,tmp1,tmp2;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(int i=-100;i<100;i++){
l=i,r=i+1;
tmp1=f(l),tmp2=f(r);
if(!tmp1){
printf("%.2lf ",l);
cnt++;
continue;
}
if(tmp1*tmp2<0){
while(r>=l){
m=(l+r)/2;
if(f(m)*f(l)<=0)r=m-0.0001,ans=m;
else l=m+0.0001,ans=m;
}
printf("%.2lf ",ans);
cnt++;
}
if(cnt==3)break;
}
l=100;
if(cnt==2)printf("%.2lf ",l);
return 0;
}