问题描述
给定两个二进制字符串,返回他们的和(用十进制字符串表示)。输入为非空字符串且只包含数字 1 和 0 ,请考虑大数问题。时间复杂度不要超过 O(n^2),其中 n 是二进制的最大长度。
输入格式
每个样例只有一行,两个二进制字符串以英文逗号“,”分割
输出格式
输出十进制格式的两个二进制的和
输入样例:
101,110
输出样例:
11
数据范围:
每个二进制不超过 100 个字符,JavaScript 语言下请考虑大数的情况。
算法分析
二进制求和,模拟加法,然后转为十进制
完整代码
#include <iostream>
#include <string>
#include<algorithm>
#include<math.h>
using namespace std;
std::string solution(std::string a, std::string b) {
// Please write your code here
string result; // 返回的结果字符串
int carry = 0;//进位
int i = a.length() - 1; // 下标
int j = b.length() - 1; // 下标
while (i >= 0 || j >= 0 ||carry!=0) {
int sum = carry;
if (i >= 0) {
sum +=
a[i--] - '0'; // 数字+字符‘0’[在计算机中以ASCII码存储]==字符
}
if (j >= 0) {
sum += b[j--] - '0';
}
result.push_back(sum % 2 + '0'); // 缝2进一
carry = sum / 2; // 如果sum是2就+1到下一位
}
reverse(result.begin(), result.end()); // 反转
//将二进制的和转为十进制
long sum=0;
int len=result.size();
for(int i=0;i<len;i++)
{
//获取当前的数字‘0’,‘1’
char bit=result[len-1-i];
if(bit=='1')
sum+=pow(2,i);
}
//将十进制转为字符串
return to_string(sum);
}
int main() {
// You can add more test cases here
std::cout << (solution("101", "110") == "11") << std::endl;
std::cout << (solution("111111", "10100") == "83") << std::endl;
std::cout << (solution("111010101001001011", "100010101001") == "242420") << std::endl;
std::cout << (solution("111010101001011", "10010101001") == "31220") << std::endl;
return 0;
}