您的位置:首页 > 其它

高精度整数(包括负数)加法

2010-07-02 23:55 567 查看
//shengsun

//高精度整数(包括负数)加法  char读入

#include <stdio.h>

#include <string.h>

const int LEN=1000; 

//高精度非负数加法, 作为函数intadd的子程序调用 

//参数(a,b: 字符串表示的加数; result: 字符串表示的结果)

//注: 传入result时最好将其初始化为0

void add(char *a,char *b,char *result)

{

      int temp[LEN]={0};

      int i,j,carry=0,len_t=0,len_c=0;

      int len_a=strlen(a);

      int len_b=strlen(b);

      for(i=len_a-1,j=len_b-1;i>=0&&j>=0;i--,j--)

      {

          temp[len_t++]=(a[i]-'0'+b[j]-'0'+carry)%10;

          carry=(a[i]-'0'+b[j]-'0'+carry)/10;

      }

      while(i>=0)                                    //处理a位数比b多的情况

      {

          temp[len_t++]=(a[i]-'0'+carry)%10;

          carry=(a[i--]-'0'+carry)/10;

      }

      while(j>=0)                                    //处理b位数比a多的情况

      {

          temp[len_t++]=(b[j]-'0'+carry)%10;

          carry=(b[j--]-'0'+carry)/10;

      }

      if(carry>0)                                    //处理最高位有进位的情况

      {

          temp[len_t++]=1;

      }

      len_t--;

      while(len_t>=0)                                //将结果转换为字符串

      {

          result[len_c++]=temp[len_t--]+'0';

      }    

}

//高精度非负数减法, 作为函数intadd的子程序调用

//参数(a,b: 字符串表示的减数; result: 字符串表示的结果)

//注: 传入result时最好将其初始化为0

void minus(char *a,char *b,char *result)

{

      int temp[LEN]={0};

      int i,j,borrow=0,len_t=0,len_c=0,flag;

      int len_a=strlen(a);

      int len_b=strlen(b);

      if((len_a>len_b)||((len_a==len_b)&&strcmp(a,b)>=0))

      {

          flag=0;               //作为结果符号的判断, flag=0表示两数相减为非负数

      }

      else 

      {

          flag=1;               //flag=1表示两数相减的结果为负数, 此时调整两减数, 使被减数位数不少于减数

          char *t=a;

          a=b;

          b=t;

      }

      len_a=strlen(a);

      len_b=strlen(b);

      for(i=len_a-1,j=len_b-1;i>=0&&j>=0;i--,j--)

      {

          temp[len_t++]=(a[i]-b[j]-borrow+10)%10;

          if(a[i]-b[j]-borrow<0)

          {

              borrow=1;

          }

          else

          {

              borrow=0;

          }

      }

      while(i>=0)               //处理被减数位数不比减数的少的情况

      {

          temp[len_t++]=(a[i]-'0'-borrow+10)%10;

          if(a[i]-'0'-borrow<0)

          {

              borrow=1;

          }

          else

          {

              borrow=0;

          }

          i--;

      }

      len_t--;

      if(flag==1)                               //处理结果的符号

      {

          result[len_c++]='-';

      }

      while(temp[len_t]==0&&len_t>0)            //处理结果前面多余无效0的情况

      {

          len_t--;

      }

      while(len_t>=0)                           //结果转换为字符串

      {

          result[len_c++]=temp[len_t--]+'0';

      }    

}

//高精度整数(含负数)加法

//参数(a,b: 字符串表示的加数; result: 字符串表示的结果)

//注: 传入result时最好将其初始化为0

void intadd(char *a,char *b,char *result)

{

     if(a[0]=='-'&&b[0]!='-')                  //a负b正相加

     {

         minus(b,&a[1],result); 

     }

     else if(a[0]!='-'&&b[0]=='-')             //a正b负相加

     {

         minus(a,&b[1],result);

     }

     else if(a[0]!='-'&&b[0]!='-')             //a正b正相加

     {

         add(a,b,result);

     }

     else                                      //a负b负相加

     {

         add(&a[1],&b[1],result);

         int lens=strlen(result);

         for(int k=lens-1;k>=0;k--)

         {

            result[k+1]=result[k];

         }

         result[0]='-';

     }

}

int main()

{

    char a[LEN-1],b[LEN-1],result[LEN];

    while(scanf("%s%s",a,b)!=EOF)

    {

        memset(result,0,sizeof(result));                 //初始化result为0    

        intadd(a,b,result);                              //调用整数(含负数)的加法函数

        printf("%s/n",result);                           //输出两数相加的结果      

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c