zoukankan      html  css  js  c++  java
  • 两个大数相加,使用字符串模拟相加过程

    大数相加不能直接使用基本的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] = '';  
    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] = '';  
    54.     }  
    55.     else if(len1 > len2)  
    56.     {  
    57.         for(i = len2; i < len1; ++i)  
    58.             temp2[i] = '0';  
    59.         temp2[len1] = '';  
    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] = '';  
    92.   
    93.     //从后向前输出,即是相加后的值  
    94.     for(i = maxLen-1; i >=0; --i)  
    95.         putchar(sum[i]);  
    96.   
    97.     printf(" ");  
    98.   
    99.     return 0;  
    100. }  
  • 相关阅读:
    kafka 流式计算
    解决山地车令人讨厌的中轴异响及其他异响问题
    go语言通道详解
    使用Spring Cloud连接不同服务
    并发之痛 Thread,Goroutine,Actor
    用go语言实现线程池
    golang go语言通道类型的通道示例 通道的通道
    Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
    spring5 reactive
    Go 语言和 Scala 语言对比
  • 原文地址:https://www.cnblogs.com/wzf-Learning/p/8109608.html
Copyright © 2011-2022 走看看