一元三次方程求解:

 注意:

1.二分边界

2.字符的处理,因为最后是输出两位小数的数字,那么定义的时候就要用double或则float,double的话输入要用%lf,float或则double的输出都是用%.2f

3.注意有个小坑,就是一开始的时候很有可能刚好是那个值需要判断一下

但是中间那个内部循环我真的不明白,为什么又不需要这样判断呢。

4.擅长用调用函数的方法,使代码简化,且保持方便

代码

只通过50%

#include<stdio.h>
double a,b,c,d;
double result(double x);
int main()
{
    double mid,left,right,i,j,y1,y2,y3,y4;

    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    for(i=-100;i<=100;i++)        //根与根之间是>=1,分为200个小区间 
       {
            left=i;right=i+1;
            y1=result(left);
            y2=result(right);
            if(y1==0)
              {
                  printf("%.2f ",i);           //这是一个小坑,要注意 
              }
            else if(y1*y2<0)
              {
                  for(j=0;j<100;j++)    //因为是精确到0.01,所以只需要把分100次就ok了 
                 {
                 mid=(left+right)/2;
                       y3=result(mid);
                       y4=result(right);  //y4不可能为零,因为已经验证过了,如果y4其实就是y2,但这个循环前提是y1*y2<0 
                  if(y3==0)
                   {printf("%.2f ",i);
                   break;}
                  else 
                  {if(y3*y4<0)
                     {
                         left=mid;
                     }
                  else
                     {
                         right=mid;
                     }
                  }
                }
            printf("%.2f ",right);          //因为这里是近视值,那是选用哪一个,是right还是left呢? 
            }    
    }
    
 } 
double result(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
}

通过100%

#include<stdio.h>
double a,b,c,d;
double result(double x);
int main()
{
    double mid,left,right,i,j,y1,y2,y3,y4;

    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    for(i=-100;i<=100;i++)        //根与根之间是>=1,分为200个小区间 
       {
            left=i;right=i+1;
            y1=result(left);
            y2=result(right);
            if(y1==0)
              {
                  printf("%.2f ",i);           //这是一个小坑,要注意 
              }
         else if(y1*y2<0)
              {
                  for(j=0;j<100;j++)    //因为是精确到0.01,所以只需要把分100次就ok了 
                 {
                 mid=(left+right)/2;
                       y3=result(mid);
                       y4=result(right);
                     //  if(y3==0)
                   // printf("%.2f ",i);
                   if(y3*y4<=0)
                     {
                         left=mid;
                     }
                  else
                     {
                         right=mid;
                     }
                }
            printf("%.2f ",right);
            }    
    }
    
 } 
double result(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值