大整数相加,每个位数小于128

本文详细解析了一个用于处理长整数相加的算法,包括如何使用指针和字符数组来实现大数加法运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


得分40, 是不是因为必须有一个空格的事儿?



#include <stdio.h>  
#include <string.h>   
#define MAX_SIZE 4000


int isNum(int c)
{
   return (c >= '0' && c <= '9') ;
}
void AddLongInteger(int * pcAddend, int len1,  int * pcAugend, int len2, int * pcAddResult)
{
    int lenSmall = 0;
    int lenBig = 0;
    int big = 0;

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

    int i = 0;


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

    for(i=0; i<lenBig+1; i++)
    {
        pcAddResult[i] = '0';
    }

    for(i=0; i< lenSmall; i++)
    {
         //printf("before:%c,%c\n", pcAddend[len1 -1 -i], pcAugend[len2 -1 -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;
         }

         //printf("mid:%c,%c\n", pcAddResult[lenBig-i], pcAddResult[lenBig - 1 - i]);
         pcAddResult[lenBig-i] += result ;
         pcAddResult[lenBig - 1 - i] += carry;               
         //printf("after:%c,%c\n", pcAddResult[lenBig-i], pcAddResult[lenBig - 1 - i]);
    }


    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;

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

}

int main()   
{   
   int input[MAX_SIZE];  
   int pcAddResult[MAX_SIZE];  

   
   int i = 0;  
   int j = 0;  

   int len1 = 0;  
   int len2 = 0;  
   int lenBig = 0;  

   int num = 0;  
   int il = 0;  
   int *p1=0, *p2=0; 
   
   for(i=0; i<255 && (input[i]=getchar())>=0 && input[i] != '\n'; i++) 
   {
       //printf("input%d:%d\n", i,input[i]);
   }
   //printf("i:%d, input[i]:%d\n",i, input[i]);
   
   il = i;

   for(i=0;i<100&& input[i]>=0;i ++)
   {
       //printf("%d,%c\n",i, input[i]);
   }
   j = 0;
   for(i=0; i<il;i++)  
   {  
       if(isNum(input[i]))   
       {  
           p1 = input +i;
           j = i;
           break;
       } 
   }
   if(i == il) return 0;
   for( ;i<il;i++)  
   {  
       if(!isNum(input[i]))   
       {  
           break;
       } 
   }  
   if(i == il) return 0;
   len1 = i - j;
     
   for( ;i<il;i++)  
   {  
       if(isNum(input[i]))   
       {  
           p2 = input +i; 
           j = i;
           break;
       } 
   }
   if(i == il) return 0;
   for( ;i<il;i++)  
   {  
       if(!isNum(input[i]))   
       {  
           break;
       } 
   }  
   len2 = i - j; 
   //printf("len1:%d, len2:%d\n", len1, len2); 
   lenBig = len1 > len2 ? len1 : len2 ;  

   if(len1>=128 || len2 >= 128) return 0;

   AddLongInteger(p1, len1, p2, len2, pcAddResult);   

   for(i=0;i<il;i++)
   {
       if(pcAddResult[i] != '0')
           break;
   }
   for(;i<lenBig+1;i++)
   {
       printf("%c", (char)pcAddResult[i]);
   }
   printf("\n");
   return 0; 
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值