NO.55 二进制之和
二进制之和
问题描述
小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。
测试样例
样例1:
输入:
binary1 = "101" ,binary2 = "110"
输出:'11'
样例2:
输入:
binary1 = "111111" ,binary2 = "10100"
输出:'83'
样例3:
输入:
binary1 = "111010101001001011" ,binary2 = "100010101001"
输出:'242420'
样例4:
输入:
binary1 = "111010101001011" ,binary2 = "10010101001"
输出:'31220'
样例5:
输入:
binary1 = "11" ,binary2 = "1"
输出:'4'
【逐位模拟二进制加法】
题目解析
- 从二进制最低位开始计算:
- 逐位处理两个二进制字符串,考虑进位。
- 模拟二进制加法:每一位的计算结果为当前两位的和加上进位,取余后保留,进位取整除值
- 结果构造:
- 从最低位计算到最高位,按顺序构造二进制和的结果
- 结果转为十进制:
- 最终结果是一个二进制字符串,将其转为十进制输出
定义变量如下:
- 进位记录:carry
- 当前低位索引:i , j
- 当前低位数值:bit1 , bit2
- 当前位之和:sum
- 最终返回字符串:rst
代码实现
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
std::string solution(std::string binary1, std::string binary2) {
string rst = "";
int carry = 0; // 进位
int i = binary1.size() - 1, j = binary2.size() - 1; //当前低位索引
int bit1, bit2;
// 从低位开始逐位计算
while(i >= 0 || j >= 0 || carry) {
if(i >= 0){ //取第一个数的当前位
bit1 = binary1[i--] - '0';
}else bit1 = 0;
if(j >= 0){ //取第二个数的当前位
bit2 = binary2[j--] - '0';
}else bit2 = 0;
int sum = bit1 + bit2 + carry; //当前位的和
carry = sum / 2; //计算进位
rst += (sum % 2) + '0'; //当前位的结果,并转化成字符加入rst中
}
// 反转结果字符串(从低位到高位)
reverse(rst.begin(), rst.end());
// 将二进制字符串转换为十进制
long long decimal = 0;
for(int i = 0;i < rst.length();i++) {
decimal = decimal * 2 + (rst[i] - '0');
}
return to_string(decimal);
}
注意:
- 对于传入的参数是 string 类型数据,需要对其进行
- '0'的操作将字符转成数字 - 留意所采用的方案是从低位计算到高位并存入 rst 字符串,所以需要对字符串进行反转才能得到正确的预期结果
【利用大整数库直接计算】
题目解析
- 将二进制数据转化成十进制:
- 每次将当前累加和乘2并加上当前位的值,将二进制转化成十进制
- 结果计算:
- 将转化后的十进制数直接相加得到预期结果
- 结果转为字符串:
- 最终结果是一个十进制字符串,将现有的数字结果转化成字符串
定义变量如下:
- 二进制转为十进制过程的累加和:decimal
- 二进制转为十进制的结果:num1 , num2
代码实现
#include <iostream>
#include <string>
using namespace std;
long long binary_to_decimal(const string& binary) {
long long decimal = 0;
for(int i = 0;i < binary.length();i++) {
decimal = decimal * 2 + (binary[i] - '0'); //每次将当前累加和乘2并加上当前位的值
}
return decimal;
}
std::string solution(std::string binary1, std::string binary2) {
//转换两个二进制字符串为十进制
long long num1 = binary_to_decimal(binary1);
long long num2 = binary_to_decimal(binary2);
//求和并转换为字符串
return to_string(num1 + num2);
}
注意:
- 这是一个简易的实现方案,借助了 long long 这一大整数结构完成题目
- 利用 to_string 对求和结果从数字转化成字符串