大整数相加2





#include <stdio.h>
#include <string.h> 
#include <stdlib.h> 
#define READ_SIZE 1000

void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult)
{
    int len1 = 0;
    int len2 = 0;
    int lenSmall = 0;
    int lenBig = 0;
    int big = 0;

    int add = 0;
    int aug = 0;
    int result = 0;
    int carry = 0;

    int i = 0;

    char * pcResult = pcAddResult ;

    len1 = strlen(pcAddend);
    len2 = strlen(pcAugend);

    if(len1>len2)
    {
        lenSmall=len2;
        lenBig = len1;
        big = 1;
    }
    else
    {
        lenSmall=len1;
        lenBig = len2;
        big = 2;
    }


    memset(pcResult, '0', lenBig+1);
    pcResult[lenBig+1] = 0;


    for(i=0; i< lenSmall; i++)
    {
         add = pcAddend[len1 -1 -i] - '0';
         aug = pcAugend[len2 -1 -i] - '0';

         result = add + aug;

         if(result >9)
         {
            carry =1;
            result = result - 10;
         } 
         else
         {
            carry = 0;
            result = result;
         }

         pcResult[lenBig-i] += result ;
         pcResult[lenBig - 1 - i] += carry;               
    }


    for(i=lenSmall; i< lenBig; i++)
    {
         if(big == 1)
         {
            result = pcAddend[len1-1-i] - '0';
         }
         else
         {
            result = pcAugend[len2-1-i] - '0';
         }

         carry = 0;
         result = result;

         pcResult[lenBig-i] += result ;
         pcResult[lenBig - 1 -i] += carry;               
    }

    if(pcResult[0] == '0')
    {
       memmove(pcAddResult, pcResult+1, lenBig+1); 
    }

}
int main(int argc ,char *argv[]) 
{ 
   char *pcAddResult = 0;

   char * p1 ;
   char * p2 ;
   char buf[READ_SIZE];
   int i = 0;
   int j = 0;
   int il = 0;
   int zero = 0;
   char *p[2];

   char * temp = 0;
   int temp_len = 0;
   int times = 0;
  
   char * linep = 0;
   int linel = 0;
   struct {
     char * p;
     int l;
   } lineBuf;
   lineBuf.p = 0;
   lineBuf.l = 0;


   //read a very long line
   while(1)
   {
      fgets(buf, READ_SIZE, stdin);
      il = strlen(buf);
      if(buf[il-1] == '\n')  
      {
         if(times == 0)
         {
             lineBuf.l = il + 1;
             lineBuf.p = malloc(lineBuf.l);
             strncpy(lineBuf.p, buf, il+1);

         }
         else
         {
             temp = lineBuf.p;
             temp_len = lineBuf.l; 
             lineBuf.l = temp_len + il + 1; 
             lineBuf.p= malloc(lineBuf.l);

             strncpy(lineBuf.p, temp, temp_len);
             strncpy(lineBuf.p + temp_len, buf, il+1);
             free(temp);
             temp = 0;
             
         }
         //printf("a:times:%d, p:%s,l:%d\n", times, lineBuf.p, lineBuf.l);
         break;
      }
      else
      {
         times ++;
         //il = READ_SIZE - 1
         // if buf is xxxx\0, il = 4
         if(times == 1)
         {
           lineBuf.l= il * times;
           lineBuf.p = malloc(lineBuf.l);
           strncpy(lineBuf.p , buf, il ); 
         }
         else
         {
            temp = lineBuf.p;
            temp_len = lineBuf.l;
            lineBuf.l = il * times;
            lineBuf.p = malloc(lineBuf.l);
            strncpy(lineBuf.p, temp, temp_len);
            strncpy(lineBuf.p + temp_len, buf, il);
            free(temp);
            temp = 0;

         }
         //printf("b:times:%d, p:%s,l:%d\n", times, lineBuf.p, lineBuf.l);
      }
   
   }
   
   if(lineBuf.l < 3)
   {
       //printf("lineBUf.l<3:%d\n", lineBuf.l);
       return 0; 
   }
   //printf("p:%s, l:%d\n", lineBuf.p, lineBuf.l);
   linep = lineBuf.p;
   linel = lineBuf.l - 1;

   for(i=0; i<linel; i++)
   {
       if(linep[i] >= '0' && linep[i] <= '9')
       {}
       else
       {
          linep[i] = 0;
       }
   }


   if(linep[0] == '0' && linep[1] != 0)    
   {    
      linep[0] = 0;     
   }    
   for(i=0; i<linel -1;i++)    
   {    
       if(linep[i] == 0)     
       {    
           if(linep[i+1] == '0' && linep[i+2] != 0)    
           {    
              linep[i+1] = 0;     
           }    
       }    
   }    
    
   j = 0; zero = 1;     
   for(i=0; i<linel; i++)    
   {    
      if(linep[i] == 0)    
      {    
          zero = 1;    
      }    
      else    
      {    
          if(zero == 1)    
          {    
             p[j++] = linep+i;    
             zero = 0;    
             if(j >=2 )
                break;
              
          }    
      }    
   }    
   if(j < 1) 
   {
      //printf("j<1:%d\n", j);
      return 0;
   }

   //printf("p0:%s, p1:%s\n", p[0], p[1]);
   pcAddResult = malloc(lineBuf.l);
   memset(pcAddResult, 0, lineBuf.l);
   AddLongInteger(p[0], p[1], pcAddResult);
   printf("%s\n", pcAddResult);

   free(pcAddResult);
   free(lineBuf.p);

   return 0; 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值