【PTA】7-29二分法単一の多項式(20分)

原理バイナリ法は、根の関数である:連続関数f(x)は逆の符号、すなわち、F()は、f(B)<0の区間[a、b]での2つの端点における値、それは間隔内にある場合少なくとも1つのルートR、すなわちf®= 0。

次の手順で二分法は、次のとおりです。

試験期間の長さは、より少ない所定の閾値よりも大きい場合、(+ b)は、出力部中点を停止/ 2、そうでない場合、
もしF()は、f(B) <0、 中間値fの算出((+ bの)/ 2);
F((+ bの)/ IF 2) 正確に0、次に(+ bである)/ 2に必要なルートであり、そうでない場合、
もしF((+ bの)/ 2) 及びf()同じ数、間隔[(+ bの)/ 2次に、根 、B]、 そう=その(+ bの)/ 2、 サイクルを繰り返す。
もしF((+ bの)/ 2) 及びf(B)同じ数、間隔でその後の根[(+ bの) / 2]、 B =(+ b)は/ように図2に示すように、 サイクルが繰り返されます。
タイトルは、プログラミング、所与3つの算出注文必要多項式F(X)= A 3 X 3 + A2X 2 + X + A 0.1 Aに与えられた区間[A、B]でルート。

入力フォーマット:
最初の行に与えられた入力多項式を順次4である係数A3、A2、A1、A0、AおよびBが順次2行目の間隔のエンドポイントが与えられます。トピックは、単一の単一のメモリの所定の間隔の多項式確実。

出力フォーマット:
行の間隔の多項式の根の出力二進場所。

サンプル入力:
3-1-31
-0.5 0.5

サンプル出力:
0.33

#include <stdio.h>
#include <math.h>
double f(double a);
double getRoot(double a,double b);
double a3, a2, a1, a0;
int main()
{
    double a,b;
    scanf("%lf%lf%lf%lf",&a3,&a2,&a1,&a0);
    scanf("%lf%lf",&a,&b);
    double root=getRoot(a,b);
    printf("%.2f\n",root);

    return 0;
}

double f(double a)
{
    return a3*pow(a,3)+a2*pow(a,2)+a1*a+a0;
}

double getRoot(double a,double b)
{
    while((b-a)>0.001)
    {
        if(f((a+b)/2)==0)
        {
            return (a+b)/2;
        }
        else if(f((a+b)/2)*f(a)>0)
        {
            a=(a+b)/2;
        }
        else
        {
            b=(a+b)/2;
        }
    }
        return (a+b)/2;
}
公開された48元の記事 ウォンの賞賛0 ビュー313

おすすめ

転載: blog.csdn.net/weixin_46399138/article/details/105389257