首页 > 试题广场 >

字符串加法

[编程题]字符串加法
  • 热度指数:5769 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解


输入两个字符串a和b,字符串内容为二进制数字,求两个字符串相加的结果,加法计算方法以二进制方式计算,并返回对应的字符串结果。要求程序尽可能的高效。示例如下:
/**
*
@param a = "1101"
*
@param b = "1100"
*
@return "11001"
*/
public String add(String a, String b){ }

数据范围:

输入描述:
输入两个字符串,如"1101", "1100"


输出描述:
"11001"
示例1

输入

1101 1100

输出

11001
示例2

输入

0 1

输出

1
#include <bits/stdc++.h>
using namespace std;

int main(){
    string a, b, s="";
    cin>>a>>b;
    int m = a.length(), n = b.length();
    int c = 0;
    if(m>n)
        b = string(m-n, '0') + b;
    else
        a = string(n-m, '0') + a;
    for(int i=max(m,n)-1;i>=0;i--){
        c += a[i]-'0' + b[i]-'0';
        s = char((c&1)+'0') + s;
        c >>= 1;
    }
    if(c==1)
        s = '1' + s;
    cout<<s<<endl;
    return 0;
}

发表于 2019-07-27 22:38:50 回复(5)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.next();
        String str2 = scanner.next();
        System.out.println(Integer.toBinaryString(Integer.valueOf(str1, 2) + Integer.valueOf(str2, 2)));
    }
}
发表于 2019-07-03 17:33:57 回复(3)
""""
进制间转换
↓          2进制             8进制             10进制            16进制

2进制          -          bin(int(x, 8))    bin(int(x, 10))    bin(int(x, 16))

8进制   oct(int(x, 2))           -          oct(int(x, 10))    oct(int(x, 16))

10进制  int(x, 2)         int(x, 8)                 -          int(x, 16)

16进制  hex(int(x, 2))    hex(int(x, 8))    hex(int(x, 10))      -
"""

if __name__ == "__main__":
    a = [int(x, 2) for x in input().strip().split()]
    print(str(bin(sum(a)))[2:])

发表于 2019-07-12 11:42:08 回复(0)
import java.util.*;
//二进制的加法
public class Main3 {
    public static void main(String[] args){
    	Scanner sca = new Scanner(System.in);
    	String[] str = sca.nextLine().split(" ");
        String a = str[0];
        String b = str[1];
        System.out.println(addBinary(a,b));
    }
  public static String addBinary(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int aLen = a.length();
        int bLen = b.length();
        int max = Math.max(aLen, bLen);
        StringBuilder ar = new StringBuilder(a).reverse();//反转,因为两个数从低位开始相加
        StringBuilder br = new StringBuilder(b).reverse();
        
        boolean isCarry = false;//是否进位
        for (int i = 0; i < max; i++) {
            char aChar = i >= aLeng ? '0' : ar.charAt(i);
            char bChar = i >= bLen ? '0' : br.charAt(i);
            if (aChar == '1' && bChar == '1') {
                sb.append(isCarry ? '1' : '0');
                isCarry = true;
            } else if (aChar == '0' && bChar == '0') {
                sb.append(isCarry ? '1' : '0');
                isCarry = false;
            } else {
                sb.append(isCarry ? '0' : '1');
            }
        }
        if (isCarry) sb.append("1");
        return sb.reverse().toString();
    }
}

发表于 2020-04-02 17:30:24 回复(0)
天啊,我写了快100行代码。。。。
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char const *argv[])
{
    string str1, str2;
    cin >> str1 >> str2;
    /*
     * 0 + 1 = 1
     * 1 + 1 = 10
     * 0 + 0 = 0
    */
    int carry = 0;
    int i = str1.length() - 1;
    int j = str2.length() - 1;
    string res("");
    while(i >= 0 && j >= 0){
        char a = str1[i--];
        char b = str2[j--];
        if((a == '0' && b == '1') || (a == '1' && b == '0')){
            if(carry){
                res = "0" + res;  //有进位
            } else{
                res = "1" + res;  //无进位
              }
        } else if(a == '0' && b == '0'){
            if(carry){
                res = "1" + res; //有进位
                carry = 0;
            } else{
                res = "0" + res; //无进位
              }
        } else if(a == '1' && b == '1'){
            if(carry){
                res = "1" + res;
            } else{
                res = "0" + res;
              }
            carry = 1;  //肯定有进位
        }
    }
    if(i >= 0){
        while(i >= 0){
            if(str1[i] == '0'){ //该位为“0”
                if(carry){ 
                    res = "1" + res;
                    carry = 0;
                } else{
                    res = "0" + res;
                }
            } else{     //该位为“1”
                if(carry){
                    res = "0" + res;
                } else{
                    res = "1" + res;
                }
            }
            --i;
        }
        if(carry){
            res = "1" + res;
        }
    } else if(j >= 0){
        while(j >= 0){
            if(str1[j] == '0'){ //该位为“0”
                if(carry){ 
                    res = "1" + res;
                } else{
                    res = "0" + res;
                }
            } else{     //该位为“1”
                if(carry){
                    res = "0" + res;
                } else{
                    res = "1" + res;
                }
            }
            --j;
        }
        if(carry){
            res = "1" + res;
        }
    } else{  //两个都走完
        if(carry){
            res = "1" + res;
        }
    }
    
    cout << res << endl;
    return 0;
}


发表于 2020-07-09 21:18:09 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();
        int num_a = Integer.parseInt(a, 2);
        int num_b = Integer.parseInt(b, 2);
        int res = num_a + num_b;
        System.out.println(Integer.toBinaryString(res));
    }
}
发表于 2020-03-02 15:48:44 回复(0)
JavaScript(Node) 😎题目:唯品会💄-二进制求和(BigInt)
leetcode067-二进制求和
const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    ouput: process.stdout
})
rl.on('line', line=>{
    let inArr = line.trim().split(' ')
    let s1 = +inArr[0], s2 = +inArr[1]
    //解法一
    // let res = (parseInt(s1,2) + parseInt(s2,2)).toString(2)
    //解法二
    let res = (BigInt(`0b${s1}`)+BigInt(`0b${s2}`)).toString(2)
    console.log(res)
})


发表于 2020-03-01 17:34:22 回复(0)
python一行系列
print(bin(sum([int(x,2) for x in input().split()]))[2:])


发表于 2019-12-28 11:12:53 回复(0)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int erzhuan(int n)//二进制转10进制
{
  int Number = 0,i=0,a;
  while(n!=0)
  {
    a =n%10; 
    n=n/10;
    Number += a*pow(2,i); 
    ++i;
  }
    return Number;
}
int shizhuan(int n) //十进制转二进制
{
int a=0,b=1,i,c;
c = n;
while(c)
{
i=c%2;
a=b*i+a;
b=b*10;
c=c/2;
}
return a;
}
int main()
{
char s[10];
int a,b,c,d;
scanf("%d%d",&b,&c);
a=erzhuan(b)+erzhuan(c);
d=shizhuan(a);
printf("%d",d);
}
发表于 2019-12-03 19:42:11 回复(0)
a, b = input().split()
res = int('0b'+a, 2) + int('0b'+b, 2)
print(bin(res)[2:])

发表于 2019-07-26 19:15:32 回复(0)

/**

  • @author laimouren

  • /
    public class Main {
    public static String add(String a,String b){

      int na = Integer.parseInt(a,2);
    
      int nb = Integer.parseInt(b,2);
      while(nb != 0){
          int temp = (na & nb) << 1;
          na = na ^ nb;
          nb = temp;
      }
      return Integer.toBinaryString(na);

    }

    }

编辑于 2021-09-28 16:44:50 回复(0)
先把两个二进制字符串转化成整数,让它们相加,然后再将结果转化为二进制
发表于 2021-08-19 10:41:47 回复(0)
import sys
messages = sys.stdin.readline().strip().split()
num1 = messages[0]
num2 = messages[1]

num = int(num1,2)+int(num2,2)
print(bin(num)[2:])

发表于 2020-06-29 16:57:17 回复(0)
var a=readline().split(' ');
print((parseInt(a[0],2)+parseInt(a[1],2)).toString(2))


发表于 2020-05-15 19:00:19 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            String a=in.next();
            String b=in.next();
            System.out.println(add(a,b));
        }
    }
    public static String add(String a,String b){
        int p1=a.length()-1;
        int p2=b.length()-1;
        int carry=0;
        String ans="";
        while(p1!=-1||p2!=-1||carry!=0){
            int n1=(p1<0)?0:a.charAt(p1)-'0';
            int n2=(p2<0)?0:b.charAt(p2)-'0';
            int sum=n1^n2^carry;
            carry=((n1&n2)==1)?1:((n1^n2)&carry);
            ans=sum+ans;
            if(p1>=0)p1--;
            if(p2>=0)p2--;
        }
        return ans;
    }
}

发表于 2020-05-15 12:15:53 回复(0)
模拟加法运算。
import java.util.Scanner;
/**
 * @Date: 2020-05-02 21:31
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] ch1 = sc.next().toCharArray();
        char[] ch2 = sc.next().toCharArray();
        int l1=ch1.length-1,l2=ch2.length-1,l3=(l1>l2?l1:l2)+1;
        char[] r = new char[l3+1];//保存结果
        r[l3] = '0';
        int num = 0;
        while (l1>=0&&l2>=0){
            num=ch1[l1]-'0'+ch2[l2]-'0'+r[l3]-'0';
            if (num==0){
                r[l3]='0';
                r[l3-1]='0';
            }else if (num==1){
                r[l3]='1';
                r[l3-1]='0';
            }else if (num==2){
                r[l3]='0';
                r[l3-1]='1';
            }else {
                r[l3]='1';
                r[l3-1]='1';
            }
            l1--;l2--;l3--;
        }
        while (l1>=0){
            num=ch1[l1]-'0'+r[l3]-'0';
            if (num==0){
                r[l3]='0';
                r[l3-1]='0';
            }else if (num==1){
                r[l3]='1';
                r[l3-1]='0';
            }else{
                r[l3]='0';
                r[l3-1]='1';
            }
            l1--;l3--;
        }
        while (l2>=0){
            num=ch2[l2]-'0'+r[l3]-'0';
            if (num==0){
                r[l3]='0';
                r[l3-1]='0';
            }else if (num==1){
                r[l3]='1';
                r[l3-1]='0';
            }else{
                r[l3]='0';
                r[l3-1]='1';
            }
            l2--;l3--;
        }
        for (int i = 0;i<r.length;i++){
            if (r[i]=='1'){
                for (;i<r.length;i++)
                    System.out.print(r[i]);
            }
        }
    }
}

发表于 2020-05-02 22:13:30 回复(0)
// 思路:把两个二进制字符串转换为十进制 ,parseInt(num,2)
// 然后通过toString(2),把十进制转换为二进制
var line=readline().split(' ').map(num => parseInt(num,2))
console.log(line.reduce((a,b) => a+b ).toString(2))

发表于 2020-04-08 17:22:21 回复(0)
两个半加器链接
import sys
from collections import deque


if __name__ == "__main__":
    #sys.stdin = open("input", "r")
    x, y = input().strip().split()
    if len(x) < len(y):
        x, y = y, x
    c = 0
    ans = deque()
    y = '0'*(len(x)-len(y)) + y
    for i in range(-1, -len(x)-1, -1):
        t1 = int(x[i]) ^ int(y[i])
        s1 = int(x[i]) and int(y[i])
        t2 = t1 ^ c
        s2 = t1 and c
        c = s1 or s2
        ans.appendleft(str(t2))
    if c != 0:
        ans.appendleft(str(c))
    print("".join(ans))

编辑于 2020-04-08 11:29:12 回复(0)
模拟一波大整数加法即可,时间复杂度O(n), 空间复杂度O(n)。
#include <bits/stdc++.h>
using namespace std;
const int maxlen = 1010;
char a[maxlen], b[maxlen], res[maxlen];
void reverseNum(char *s) {
    int l = 0, r = strlen(s) - 1;
    while(l < r) {
        char temp = s[l];
        s[l] = s[r];
        s[r] = temp;
        l++, r--;
    }
}
void add(char *a, char *b) {
    int i = 0, j = 0, k = 0;
    int lena = strlen(a), lenb = strlen(b);
    int curDigit = 0, acc = 0;
    while(i < lena && j < lenb) {
        curDigit = (a[i] - '0') + (b[j] - '0') + acc;
        acc = curDigit / 2;
        res[k++] = (curDigit % 2) + '0';
        i++, j++;
    }
    while(i < lena) {
        curDigit = (a[i] - '0') + acc;
        acc = curDigit / 2;
        res[k++] = (curDigit % 2) + '0';
        i++;
    }
    while(j < lenb) {
        curDigit = (b[j] - '0') + acc;
        acc = curDigit / 2;
        res[k++] = (curDigit % 2) + '0';
        j++;
    }
    if(acc == 1)
        res[k++] = acc + '0';
    res[k] = '\0';
    reverseNum(res);
    printf("%s\n", res);
}
int main() {
    int i, j;
    scanf("%s %s", a, b);
    reverseNum(a);
    reverseNum(b);
    add(a, b);
    return 0;
}


发表于 2020-04-01 14:41:08 回复(0)
#include <iostream>
(720)#include <string>
using namespace std;
int main(){
    string s1,s2,ans="";
    cin>>s1>>s2;
    int idx=0,l1=s1.size()-1,l2=s2.size()-1;
    while (l1>=0 || l2>=0){
        int c1=l1>=0?s1[l1]-'0':0,c2=l2>=0?s2[l2]-'0':0;
        int p=c1+c2;
        if (p==2){
            if (p+idx==3){
                ans="1"+ans;
            }else{
                ans="0"+ans;
            }
            idx=1;       
        }
        else if (p==1){
            if (p+idx==2){
                ans="0"+ans;
                idx=1;
            }else{
                ans="1"+ans;
                idx=0;
            }
        }else{
            if(p+idx==1){
                ans="1"+ans;
            }else{
                ans="0"+ans;
            }
            idx=0;
        }
        l1--;
        l2--;
    }
    if (idx==1)
        ans="1"+ans;
    cout<<ans;
    return 0;
}
//python:print(bin(sum(map(lambda x:int(x,2),input().split())))[2:])

编辑于 2020-03-30 11:40:11 回复(0)