NOip2001キュービック式

立方方程式二分法が要求ルーツ範囲の主題によれば、解決[-100100]

トピックが与えられているので、すべての根は-100と100の間であり、ルートゾーンがどうなるかで考えてみましょう

そして、根と根の間の差は、条件1の限界未満ではない、それが発見されました、

インナー、... [99、100]、[100,100] 201この区間[99、-98] - [-100、-99]で

ルートまでの各区間内に存在するので、区間[100、100]の除去、[--100、100]ができ、

他の区間[+ 1]、またはf(A)= 0、またはF(A + 1)この式がこの範囲0で唯一の解決策×F(A)<。

方程式の2根を求めます

(a、b)は、我々は、より低い精度の根の値を決定することが可能ルート方法の範囲を狭くすることができる徐々に間隔で式f(x)= 0の場合、唯一のルートを決定します。次のように精度を所定のタイトルルートは、方程式の根内の次の要件の二分の間隔(a、b)は0.01です。

(1)現在の存在は(b)の間隔をとることができます。

+ 0.001> BまたはF((A + B)/ 2)= 0の場合(2)、ルート(A + B)/ 2と出口手順として決定されてもよいです。

(3)もし、F×F(A)((+ B)/ 2)<0、次いで間隔で根((A + B)/ 2)、

  故对区间(a, (a+b)/2)重复该过程;

F(A)は、f×((A + B)/ 2)> 0の場合(4)、次いで、((A + B)/ 2)×F(B)<0、がfとしなければなりません

  也就是说根在((a+b)/2,b)中,应该对此区间重复该过程。 
  
  代码如下:
  
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//本题中特别注意的函数abs(),abs是取整数的绝对值,返回整数值
//fabs()才是用来求浮点数的绝对值,返回浮点数 
float a,b,c,d;
float f(float x) //返回函数值的函数 
{
    return a*x*x*x+b*x*x+c*x+d; 
}
int main(int argc, char *argv[]) {
    float i,x,x1,x2;
    int ans=0;  //用于统计解的个数 
    scanf("%f%f%f%f",&a,&b,&c,&d);
//  printf("%.2f\n",f(-0.5));
    for(i=-100;i<100;i++)
    {
        if(abs(f(i)*f(i+1))==0) //首先判定f(i)=0的解 
        {
          if(abs(f(i))==0)
          {
            x=i;
            ans++;
            printf("%.2f ",x);
          } 
        }
        else if(f(i)*f(i+1)<0) //满足解在范围[i,i+1]内的条件 
        {
            x1=i;  
            x2=i+1;
            x=(x1+x2)/2;//若解在[i,i+1]内,采用二分法,查找解 
            while(fabs(f(x))>0.000001&&(x1+0.001)<x2) 
            {  //由于实数运算的误差,判断x是否满足方程f(x)=0
               //应用条件表达式 fabs(f(x))<0.000001来判断,否则将失根。 
               //   printf("%.2f\n",f(x));
                if(f(x)*f(x1)>0)//若f(x)*f(x1)>0,则根在[x,x2]范围内 
                {
                    x1=x;       //修改根的范围 
                    x=(x1+x2)/2;
                //  printf("%.2f %f\n",x,f(x));
                }
                else
                {
                    x2=x;       //否则f(x)*f(x1)<=0,则根在[x1,x]范围内 
                    x=(x1+x2)/2;
                //  printf("%.2f %f\n",x,f(x));
                }
            }
            ans++;
            printf("%.2f ",x);//输出在[i,i+1]内,使用二分法找到的解 
        }
        if(ans>=3) break;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/zi-nai-boboyang/p/11465231.html