P1024 一元三次方程求解

题意:给出一个一元三次方程,让我们求未知数

   题目保证有三个解,并且相邻解的差值大于等于1(这是关键)

思路:所以我们需要求出三个解,而二分也就只能得出一个答案,一时半会儿下不去手

   然后发现相邻解的差值大于等于1,可以从这里下手;

    因为相邻范围为1,而总的解的范围只是在-100 到 100,所以可以通过枚举的方式

      那么如何枚举呢,我们从-100到100逐一枚举 每次枚举判断i和i+1这两个位置

        倘若i得出的值为0,便可以直接输出

        倘若得出的不为0,就判断i*i+1所得出的函数

          如果>0,证明其中无解,直接跳到下一次枚举

          如果<0,证明其中有解,则二分查找答案,精度要求为0.01,我们精确到0.001,然后输出即可

 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 }
View Code

 

posted @ 2020-04-10 09:36  古比  阅读(212)  评论(0编辑  收藏  举报