原理バイナリ法は、根の関数である:連続関数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;
}