P1024 一元三次方程求解
题意:给出一个一元三次方程,让我们求未知数
题目保证有三个解,并且相邻解的差值大于等于1(这是关键)
思路:所以我们需要求出三个解,而二分也就只能得出一个答案,一时半会儿下不去手
然后发现相邻解的差值大于等于1,可以从这里下手;
因为相邻范围为1,而总的解的范围只是在-100 到 100,所以可以通过枚举的方式
那么如何枚举呢,我们从-100到100逐一枚举 每次枚举判断i和i+1这两个位置
倘若i得出的值为0,便可以直接输出
倘若得出的不为0,就判断i*i+1所得出的函数
如果>0,证明其中无解,直接跳到下一次枚举
如果<0,证明其中有解,则二分查找答案,精度要求为0.01,我们精确到0.001,然后输出即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 double a,b,c,d; 4 double cal(double x) 5 { 6 return a*x*x*x+b*x*x+c*x+d; 7 } 8 int check(double x) 9 { 10 double tmp=cal(x); 11 if(tmp>0) return 1; 12 if(tmp<0) return -1; 13 else return 0; 14 } 15 int main() 16 { 17 scanf("%lf%lf%lf%lf",&a,&b,&c,&d); 18 for(int i=-100;i<=100;i++){ 19 double tmp=i; 20 double tmp1=cal(tmp); 21 double tmp2=cal(tmp+1); 22 if(!tmp1){ 23 // printf("hahahah\n"); 24 printf("%.2f ",tmp); 25 } 26 if(tmp1*tmp2<0){ 27 if(tmp1<0){ 28 double L=i; 29 double R=i+1; 30 while(R-L>=0.001){ 31 double mid=(L+R)/2; 32 if(check(mid)>0){ 33 R=mid; 34 } 35 if(check(mid)<0){ 36 L=mid; 37 } 38 } 39 printf("%.2f ",L); 40 } 41 else{ 42 double L=i; 43 double R=i+1; 44 while(R-L>=0.001){ 45 double mid=(L+R)/2; 46 if(check(mid)>0){ 47 L=mid; 48 } 49 if(check(mid)<0){ 50 R=mid; 51 } 52 } 53 printf("%.2f ",L); 54 } 55 } 56 } 57 printf("\n"); 58 return 0; 59 }