实现两个长字符串相加

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

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

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

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

/** 
* 两个大数相加,且这两个大数是正整数 
* 暂时不考虑负数,不考虑输入不合法的情况 
* 要保证输入是正确的才能保证程序正常运行 
*/  
  
#include <stdio.h>  
#include <string.h>  
  
#define MAXSIZE 1000  
  
int main()  
{  
    char number1[MAXSIZE+1];  
    char number2[MAXSIZE+1];  
    char sum[MAXSIZE+2];  
    char temp1[MAXSIZE+1];  
    char temp2[MAXSIZE+1];  
    int len1 = 0;  
    int len2 = 0;  
    int i = 0;  
    int j = 0;  
    int maxLen = 0;  
    int nSum = 0;  
    int nCarryBit = 0;  
    int nOverFlow = 0;  
  
    gets(number1);  
    gets(number2);  
  
    //1.反转字符串,便于从低位到高位相加和最高位的进位导致和的位数增加  
    len1 = strlen(number1);  
    len2 = strlen(number2);  
  
    j = 0;  
    for(i = len1-1; i >= 0; --i)  
    {  
        temp1[j++] = number1[i];  
    }  
    temp1[j] = '\0';  
    j = 0;  
    for(i = len2-1; i >= 0; --i)  
    {  
        temp2[j++] = number2[i];  
    }  
  
    //2.把两个字符串补齐,即短字符串的高位用‘0’补齐  
    maxLen = (len1 > len2)?len1:len2;  
    if(len1 < len2)  
    {  
        for(i = len1; i < len2; ++i)  
            temp1[i] = '0';  
        temp1[len2] = '\0';  
    }  
    else if(len1 > len2)  
    {  
        for(i = len2; i < len1; ++i)  
            temp2[i] = '0';  
        temp2[len1] = '\0';  
    }  
  
    //3.把两个正整数相加,一位一位的加并加上进位  
    for(i = 0; i < maxLen; i++)  
    {  
        nSum = temp1[i] - '0' + temp2[i] - '0' + nCarryBit;  
  
        if(nSum > 9)  
        {  
            if(i == (maxLen-1))  
            {  
                nOverFlow = 1;  
            }  
              
            nCarryBit = 1;  
              
            sum[i] = nSum - 10 + '0';  
        }  
        else  
        {  
            nCarryBit = 0;  
            sum[i] = nSum + '0';  
        }  
  
    }  
  
    //如果溢出的话表示位增加了  
    if(nOverFlow == 1)  
    {  
        sum[maxLen++] = nCarryBit + '0';  
    }  
    sum[maxLen] = '\0';  
  
    //从后向前输出,即是相加后的值  
    for(i = maxLen-1; i >=0; --i)  
        putchar(sum[i]);  
  
    printf("\n");  
  
    return 0;  
}  
#include <iostream>
#include <string>
#include <algorithm>
using namespace  std;
int main(){
    string num1,num2;
    string res;
    int carry=0;//进位
    while(cin>>num1>>num2){
        const size_t  len=(num1.size()>num2.size())?num1.size():num2.size();
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());
        for(size_t i=0;i<len;i++){
            const int num1_tmp=i<num1.size()?num1[i]-'0':0;
            const int num2_tmp=i<num2.size()?num2[i]-'0':0;  //对齐
            const  int sum=(num1_tmp+num2_tmp+carry)%10;
            carry=(num1_tmp+num2_tmp+carry)/10;
            res.insert(res.begin(), sum+'0');
            
        }
        if(carry==1){
            res.insert(res.begin(), '1');
        }
        cout<<res<<endl;
        res.clear();
        carry=0;
    }
    return 0;
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值