LCR002.二进制求和

剑指offer(专项突破版)1.2 二进制

题目链接:LCR002-二进制求和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//自己第一遍写的代码
class Solution {
public:
string addBinary(string a, string b) {
//两个字符串长度不同,补零
if(a.length() < b.length()){
swap(a,b);
}
int diff = a.length()-b.length();
for(int i = 0;i < diff;i++){
b = "0" + b;
}

string res = ""; //结果字符串
int carry = 0; //进位

//逐位相加
for(int i = a.length()-1;i >= 0;i--){
int sum = (a[i]-'0') + (b[i]-'0') + carry;
int cur = sum % 2;
carry = sum / 2;
res = to_string(cur) + res;
}
if(carry == 1){
res = "1" + res;
}
return res;
}
};

书中的思路:i、j分别指向两个字符串的第i、j个位置,不在一开始将两个字符串长度补齐,而是在相加过程中判断。按照书中的思路重新写一遍代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
string addBinary(string a, string b) {
string res = "";
int carry = 0;

// i、j分别指向字符串a、b的最后一个字符
int i = a.length() - 1;
int j = b.length() - 1;

//逐位相加
while(i >=0 || j >= 0){
int digitA = i>=0 ? a[i--]-'0' : 0;
int digitB = j>=0 ? b[j--]-'0' : 0;
int sum = digitA + digitB + carry;
carry = sum / 2;
res = to_string(sum % 2) + res;
}
if(carry == 1){
res = "1" + res;
}
return res;
}
};

结果对比:

方法1:

方法2:

补充内容

C语言中的转换

  1. 使用标准库函数atoi和atof:
  • atoi函数将字符串转换为整数
  • atof函数将字符串转换为浮点数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdlib.h> //包含atoi、atof函数
    #include <stdio.h> //包含printf函数

    int main() {
    char str[] = "12345";
    int num = atoi(str);
    float float_num = atof(str);
    printf("num: %d\n",num);
    printf("float_num: %f\n",float_num);
    return 0;
    }
    结果:
  1. 使用标准库函数sprintf和sscanf
  • sprintf函数将格式化的数据写入字符串。

  • sscanf函数从字符串中读取格式化的数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     #include <stdio.h>

    int main() {
    char str[20];
    int num = 12345;
    float float_num = 123.45;
    sprintf(str, "%d", num);
    sscanf(str, "%d", &num);
    printf("str: %s\n",str);
    printf("num: %d\n",num);

    sprintf(str, "%f", float_num);
    sscanf(str, "%f", &float_num);
    printf("str: %s\n",str);
    printf("float_num: %f\n",float_num);
    return 0;
    }

    输出结果:

    因为浮点数在内存中的表示方式和人类理解的十进制表示方式存在微小的差异,导致在转换为字符串和再次从字符串转换回浮点数时可能会引入精度损失。这是由于浮点数的存储方式决定的,它们以二进制形式存储,并且无法精确地表示一些十进制小数。

    解决这个问题的一种方法是使用精确度格式说明符来限制输出的小数位数。例如,对于sprintf,可以使用”%.2f”来限制输出到小数点后两位。这样可以减小精度损失。

C++中的转换

  1. 使用字符串流 stringstream:

    使用 std::stringstream 类可以很方便地在字符串和数值之间进行转换。可以使用 << 操作符将数值插入到字符串流中,或者使用 >> 操作符从字符串流中提取数值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <iostream>
    #include <sstream>
    #include <string>
    int main() {
    std::string str = "12345";
    int num;
    std::stringstream(str) >> num; // 将字符串转换为整数
    std::cout << "num: " << num << std::endl;

    int another_num = 54321;
    std::stringstream stream;
    stream << another_num; // 将整数转换为字符串
    std::string result = stream.str();
    std::cout << "result: " << result << std::endl;

    return 0;
    }

  2. 使用标准库函数 stoi 和 to_string:

    C++11 引入了 std::stoi 和 std::to_string 函数,分别用于将字符串转换为整数和将整数转换为字符串。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <string>
    int main() {
    std::string str = "12345";
    int num = std::stoi(str); // 将字符串转换为整数
    std::cout << "num: " << num << std::endl;

    int another_num = 54321;
    std::string result = std::to_string(another_num); // 将整数转换为字符串
    std::cout << "result: " << result << std::endl;

    return 0;
    }

LCR002.二进制求和
http://example.com/2024/03/01/posts/LCR002-二进制求和/
作者
Xuan Yang
发布于
2024年3月1日
许可协议