高精度数加減演算

3244 ワード

文字列を使用してデータを読み込む
高精度数タイプの定義
#define MAXLEN 3000

typedef struct

{

     int sign;      //0  1 

    int ni;             //    

     int a[MAXLEN];//    

     int nd;            //    

     int d[MAXLEN];//    

}BIGFLOAT;


  
void assign(int sign, char s[], BIGFLOAT *x)

{

    int i,ip,m,c;

    for(i=0;i<MAXLEN;i++) x->a[i]=0;

    for(i=0;i<MAXLEN;i++) x->d[i]=0;

    x->sign = sign;

    m = strlen(s);

    ip = m;

    for(i=0;i<m;i++)

    {

         if(s[i]=='.') ip=i;

    }

    for(i=ip-1;i>=0;i--)

    {

         c=s[i]-'0';

         if(c>=0&&c<=9)

              x->a[ip-1-i]=c;

    }

    for(i=ip+1;i<m;i++)

    {

         c=s[i]-'0';

         if(c>=0&&c<=9)

              x->d[x->nd-(i-ip)]=c;

    }

}


 
void add(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)

{

    int i,s,carry=0;

    c->ni = a.ni;                 //

    c->nd = a.nd;               //

    for(i=0;i<c->nd;i++)

    {

         s=carry+a.d[i]+b.d[i];

         c->d[i]=s%10;

         carry=s/10;

    }

     //           

    for(i=0;i<c->ni;i++)

    {

         s=carry+a.a[i]+b.a[i]; //      

         c->a[i] = s%10;          //          

         carry = s/10;               //    

    }

}


  
void sub(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)

{

    int i;

    c->ni=a.ni;

    c->nd=a.nd;

    //           

    for(i=0;i<c->nd;i++)

    {

        if(b.d[i]>a.d[i])                           //           

        {

             if(i+1==c->nd) a.a[0] -=1;    //        

             else  a.d[i+1] -=1;                //     

             a.d[i] +=10;                         //   ,        

        }

        c->d[i]=a.d[i]-b.d[i];                  //      

    }

    //           

    for(i=0;i<c->ni;i++)

    {

         if(b.a[i]>a.a[i])

         {

              a.a[i+1]-=1;

              a.a[i]+=10;

          }

         c->a[i]=a.a[i]-b.a[i];

    }

}


  
void sum(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)     //              

{

    int sign;

    if(a.sign == b.sign)

    {

         c->sign = a.sign;

         add(a,b,c);

    }

    else

    {

        sign = compare(a,b);                    //1 ,0 

      if(sign==0)                                   //a       b    

         {

             c->sign=a.sign;                        //             

             sub(a,b,c);                               //           

         }

          else

          {

                c->sign = b.sign;                   //             

                sub(b,a,c);                            //                           

          }

    }

}



//             

int compare(BIGFLOAT a, BIGFLOAT b)

{

    int i;

    for(i=a.ni-1;i>=0;i--)

  {

      if(b.a[i]>a.a[i]) return 1;               //      

      if(b.a[i]<a.a[i]) return 0;

  }

   for(i=a.nd-1;i>=0;i--)                        //       ,       

         if(b.d[i]>a.d[i])   return 1;



    return 0;

}