大整数相加2

来源:互联网 发布:美国最新非农数据分析 编辑:程序博客网 时间:2024/05/17 02:51





#include <stdio.h>#include <string.h> #include <stdlib.h> #define READ_SIZE 1000void 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; }


0 0
原创粉丝点击