学习方法与心得2 | 豆包MarsCode AI 刷题

149 阅读4分钟

二进制之和题解

1. 问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n2)O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

2. 解题思路

2.1 问题分析

在这道题中,我们需要实现一个算法,能够对两个二进制字符串进行相加,并返回它们的十进制求和结果。这种需求在数据处理和大数运算中非常常见。特别是当二进制串的长度非常大时,普通的整型数据类型可能无法支持,因此需要特别关注大数处理。我们将在解析中详细讨论如何设计这样一个算法,以及该算法背后的原理。

2.2 基本思路

首先,二进制加法与十进制加法有相似之处。我们可以逐位将两个二进制数的每个位相加,同时保留进位。常见的二进制加法思路是将两数逐位相加,从最低位开始,结果超过1时将进位加至下一位。我们的目标是将这个二进制求和结果转换成十进制。解决这个问题的关键在于:将二进制串转换成十进制整数,然后直接对两个整数相加,最后将和转换成字符串输出

由于二进制字符串可能非常长,直接将其转换成整数可能造成数据溢出。因此,C++中的std::stoull()函数成为理想的选择,它能够将字符串直接转换成无符号长整型的二进制形式。这种转换提供了基础加法运算,但需要注意,std::stoull()支持的数字范围受限,如果超过了无符号长整型的范围,程序就会报错。

2.3 示例

为了便于理解,我们来看一个简单的示例:

假设我们有两个二进制字符串binary1 = "101"binary2 = "110",按照步骤分析:

  1. 二进制转换:首先,我们将binary1binary2转换为十进制整数。101(二进制)等于5(十进制),110(二进制)等于6(十进制)。
  2. 十进制加法:将这两个十进制数相加,5 + 6 = 11
  3. 结果输出:最终将十进制求和结果转换为字符串,即"11"

为了更大规模的计算,我们可以将这一操作封装到solution函数中。

2.4 代码

#include <iostream>
#include <string>
#include <bitset>

std::string solution(std::string binary1, std::string binary2) {
    // 将二进制字符串转换为十进制整数
    long long num1 = std::stoull(binary1, nullptr, 2);
    long long num2 = std::stoull(binary2, nullptr, 2);
    // 计算十进制整数之和
    long long ans = num1 + num2;
    // 将结果转换为字符串并返回
    return std::to_string(ans);
}

int main() {
    // 测试用例
    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;
}

3. 代码详解

3.1 二进制到十进制的转换

std::stoull(binary1, nullptr, 2)使用标准库函数std::stoullbinary1从二进制字符串转换成无符号长整型的十进制整数。nullptr表示我们不关心字符串解析的终止位置,而参数2指定了输入字符串的进制为二进制。通过这种方式,代码能够直接对大数字进行十进制转换。

3.2 十进制加法

在这一步中,num1num2直接相加。由于二进制转换后的数据都是十进制的,简单的加法运算即可完成求和过程,省去逐位运算的复杂步骤。

3.3 结果转换为字符串输出

最后,函数将十进制求和结果转换成字符串格式并返回。std::to_string(ans)完成这个转换,使得结果可以用字符串形式进行返回和输出。