2 solutions
-
5
#include<bits/stdc++.h> #define int long long using namespace std; double a,b,c,d; #define f(x) (a*x*x*x+b*x*x+c*x+d) //宏定义函数 double A[1005]={}; //用来存答案 int q=-1; //记录下标 signed main(){ cin>>a>>b>>c>>d; //尺取法求零点 for(double l=-100,r=100;l<=r;l+=0.01,r-=0.01){ if(f(l)>-0.001&&f(l)<0.001) A[++q]=l; if(f(r)>-0.001&&f(r)<0.001) A[++q]=r; //因为是双精度浮点数所以不能直接写==0 //要夹在两个小数之间 } sort(A,A+q+1); //排序 for(int i=0;i<=q;i++) cout<<fixed<<setprecision(2)<<A[i]<<' '; cout<<"\n"; return 0; }
尺取法双指针比二分快
-
3
P1024 一元三次方程求解
解析见代码
#include<bits/stdc++.h> using namespace std; double exp(double a,double b,double c,double d,double x){ return a*pow(x,3)+b*x*x+c*x+d;//为简化计算过程,这里用函数表示 } const double eps=1e-6;//二分临界 double a,b,c,d,cnt=0;//cnt 用于计数 ,cnt++表示有了一个解 int main(){ cin>>a>>b>>c>>d; for(int i=-100;i<=100;i++){ double l=i,r=i+1;//由"且根与根之差的绝对值>=1"为依据截取区间 double ansl=exp(a,b,c,d,l); double ansr=exp(a,b,c,d,r); if(!ansl){ cout<<fixed<<setprecision(2)<<l<<' '; cnt++; //若有解,输出,还剩两个解 } if(ansl*ansr<0){ while(r-l>=eps){ double mid=(l+r)/2; if(exp(a,b,c,d,mid)*ansr<=0){//由题目提示可得条件 l=mid; } else r=mid; } cout<<fixed<<setprecision(2)<<r<<' '; cnt++; } if(cnt==3){ return 0;//若得到三个解,则输出 } } return 0; }
- 1
Information
- ID
- 24
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 2
- Tags
- # Submissions
- 90
- Accepted
- 33
- Uploaded By