pta7-18二分法求多项式单根总是在测试点二显示运行超时,改了几次都没改过,求各位看看错在哪。

img

img

#include <stdio.h>
float a3,a2,a1,a0;
float f(float x);
int main()
{
    float a,b;
    scanf("%f %f %f %f",&a3,&a2,&a1,&a0);
    scanf("\n%f %f",&a,&b);
    float left,right;
    left=a;
    right=b;
    float mid=0;
    while(right-left>=0.0001&&f(left)*f(right)<=0){
        if(f(left)==0){
            printf("%.2f",left);
            return 0;
        }else if(f(right)==0){
            printf("%.2f",right);
            return 0;
        }
        mid=(left+right)/2;
        if(f(mid)*f(left)>0){
            left=mid;
        }else if(f(mid)*f(left)<0){
            right=mid;
        }
    } 
    printf("%.2f",mid);
    return 0;
}
float f(float x){
    float end;
    end=a3*x*x*x+a2*x*x+a1*x+a0;
    return end;
}

试试这样:

#include <stdio.h>
float a3,a2,a1,a0;
float f(float x);
int main()
{
    float a,b;
    scanf("%f %f %f %f",&a3,&a2,&a1,&a0);
    scanf("\n%f %f",&a,&b);
    float left,right;
    left=a;
    right=b;
    float mid=0;
    while(right-left>=0.0001&&f(left)*f(right)<=0){
        if(f(left)==0){
            printf("%.2f",left);
            return 0;
        }else if(f(right)==0){
            printf("%.2f",right);
            return 0;
        }
        mid=(left+right)/2;
        if(f(mid)*f(left)>0){
            left=mid;
        }else if(f(mid)*f(left)<0){
            right=mid;
        }else{
            printf("%.2f",mid);
            return 0;
        }
    } 
    printf("%.2f",mid);
    return 0;
}
float f(float x){
    float end;
    end=a3*x*x*x+a2*x*x+a1*x+a0;
    return end;
}
 

img

你可以这样设计程序的二分治法,没输入一次拍一次序,由于前面 的是已经排好的序列,后面再插入数据时,是对已经排好顺序的数据插入新数据排序,这样会更快些