两个大数相加,使用字符串模拟相加过程

大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求。可以使用字符串来表示大数,模拟大数相加的过程。

思路:1.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;

            2.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;

            3.把两个正整数相加,一位一位的加并加上进位。

具体代码如下:

  1. /** 
  2. * 两个大数相加,且这两个大数是正整数 
  3. * 暂时不考虑负数,不考虑输入不合法的情况 
  4. * 要保证输入是正确的才能保证程序正常运行 
  5. */  
  6.   
  7. #include <stdio.h>  
  8. #include <string.h>  
  9.   
  10. #define MAXSIZE 1000  
  11.   
  12. int main()  
  13. {  
  14.     char number1[MAXSIZE+1];  
  15.     char number2[MAXSIZE+1];  
  16.     char sum[MAXSIZE+2];  
  17.     char temp1[MAXSIZE+1];  
  18.     char temp2[MAXSIZE+1];  
  19.     int len1 = 0;  
  20.     int len2 = 0;  
  21.     int i = 0;  
  22.     int j = 0;  
  23.     int maxLen = 0;  
  24.     int nSum = 0;  
  25.     int nCarryBit = 0;  
  26.     int nOverFlow = 0;  
  27.   
  28.     gets(number1);  
  29.     gets(number2);  
  30.   
  31.     //1.反转字符串,便于从低位到高位相加和最高位的进位导致和的位数增加  
  32.     len1 = strlen(number1);  
  33.     len2 = strlen(number2);  
  34.   
  35.     j = 0;  
  36.     for(i = len1-1; i >= 0; --i)  
  37.     {  
  38.         temp1[j++] = number1[i];  
  39.     }  
  40.     temp1[j] = '\0';  
  41.     j = 0;  
  42.     for(i = len2-1; i >= 0; --i)  
  43.     {  
  44.         temp2[j++] = number2[i];  
  45.     }  
  46.   
  47.     //2.把两个字符串补齐,即短字符串的高位用‘0’补齐  
  48.     maxLen = (len1 > len2)?len1:len2;  
  49.     if(len1 < len2)  
  50.     {  
  51.         for(i = len1; i < len2; ++i)  
  52.             temp1[i] = '0';  
  53.         temp1[len2] = '\0';  
  54.     }  
  55.     else if(len1 > len2)  
  56.     {  
  57.         for(i = len2; i < len1; ++i)  
  58.             temp2[i] = '0';  
  59.         temp2[len1] = '\0';  
  60.     }  
  61.   
  62.     //3.把两个正整数相加,一位一位的加并加上进位  
  63.     for(i = 0; i < maxLen; i++)  
  64.     {  
  65.         nSum = temp1[i] - '0' + temp2[i] - '0' + nCarryBit;  
  66.   
  67.         if(nSum > 9)  
  68.         {  
  69.             if(i == (maxLen-1))  
  70.             {  
  71.                 nOverFlow = 1;  
  72.             }  
  73.               
  74.             nCarryBit = 1;  
  75.               
  76.             sum[i] = nSum - 10 + '0';  
  77.         }  
  78.         else  
  79.         {  
  80.             nCarryBit = 0;  
  81.             sum[i] = nSum + '0';  
  82.         }  
  83.   
  84.     }  
  85.   
  86.     //如果溢出的话表示位增加了  
  87.     if(nOverFlow == 1)  
  88.     {  
  89.         sum[maxLen++] = nCarryBit + '0';  
  90.     }  
  91.     sum[maxLen] = '\0';  
  92.   
  93.     //从后向前输出,即是相加后的值  
  94.     for(i = maxLen-1; i >=0; --i)  
  95.         putchar(sum[i]);  
  96.   
  97.     printf("\n");  
  98.   
  99.     return 0;  
  100. }  
运行结果:


猜你喜欢

转载自blog.csdn.net/koanzhongxue/article/details/45308677