字符串求和(大数加法)

题目描述

输入两个字符串a和b,字符串内容为二进制数字,求两个字符串相加的结果,加法计算方法以二进制方式计算,并返回对应的字符串结果。要求程序尽可能的高效。示例如下:

/**

  • @param a = “1101”

  • @param b = “1100”

  • @return “11001”

*/

public String add(String a, String b){ }

输入描述:

输入两个字符串,如"1101", “1100”

输出描述:

11001

示例1

输入
1101 1100

输出
11001

思路:字符串求和等价于大数求和,采用四步走:

  1. 将字符转换为数字,即使用数组存储字符串,因为考虑进位需要将数组的长度+1
  2. 数组中对应下标的数字求和
  3. 计算进位
  4. 将数组转换为字符串
#include<iostream>
#include<string>
#include<vector>
using namespace std;
/**  

* @param a = "1101"  

* @param b = "1100"  

* @return "11001"  

*/ 

string add(string a, string b){
    int la=a.length(),lb=b.length();
    int l = la>lb?la+1:lb+1;//防止最高位有进位
    vector<int> va(l,0);
    vector<int> vb(l,0);
    //1.字符转数字,a从最低位到最高位读取,va从0开始存
    for(int m=0,i=la-1;i>=0;m++,i--)
    {
        va[m]=a[i]-'0';
    }
    for(int m=0,i=lb-1;i>=0;m++,i--)
    {
        vb[m]=b[i]-'0';
    }
    //2.对应位求和
    for(int i=0;i<l;i++)
    {
        va[i]+=vb[i];
    }
    //3.计算进位
    for(int i=0;i<l;i++)
    {
        if(va[i]>=2)
        {
            va[i+1]=va[i+1]+va[i]/2;
            va[i]=va[i]%2;
        }
    }
    string res="";
    //从尾到头找到第一个非0数字,然后进行数字到字符串转换
    int k;
    for(int i=l-1;i>=0;i--)
    {
        if(va[i]==0)
            continue;
        else{
            k=i;
            break;
        }
    }
    for(int i=k;i>=0;i--)
    {
        res+=to_string(va[i]);
    }
    return res;
}
int main()
{
    string a,b;
    cin>>a>>b;
    string res = add(a,b);
    cout<<res<<endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值