67. Add Binary

本文介绍了一种解决两个二进制字符串相加问题的方法。通过遍历字符串并使用简单的位运算来实现相加,同时处理进位情况。提供两种实现方案:一种使用字符比较,另一种则利用字符的ASCII值进行计算。

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

简单方法,依次相加,若一个string加完还有进一,则对接下来的继续加

class Solution {
public:
    string addBinary(string a, string b) {
        int lena=a.length();
        int lenb=b.length();
        if(lena==0){
            return b;
        }
        if(lenb==0){
            return a;
        }
        int count=0;
        if(lena<lenb){
            string tmp=a;
            a=b;
            b=tmp;
            int tmp1=lena;
            lena=lenb;
            lenb=tmp1;
        }
        
            for(int i=lenb-1,j=lena-1;i>=0;i--,j--){
                if(count==0){
                    if((a[j]=='1')&&(b[i]=='1')){
                        a[j]='0';
                        count=1;
                    }
                    else if((a[j]=='1')||(b[i]=='1')){
                        a[j]='1';
                        count=0;
                    }
                }
                else{
                    
                    if((a[j]=='1')&&(b[i]=='1')){
                        a[j]='1';
                        count=1;
                    }
                    else if((a[j]=='1')||(b[i]=='1')){
                        a[j]='0';
                        count=1;
                    }
                    else{
                        a[j]='1';
                        count=0;
                    }
                }
            }
            for(int i=lena-lenb-1;i>=0;i--){
                if(count==1){
                    if(a[i]=='1'){
                        a[i]='0';
                    }
                    else{
                        a[i]='1';
                        count =0;
                    }
                }
                else{
                    break;
                }
            }
            if(count==1){
                a='1'+a;
            }
        
        return a;
    }
};

改进后,char型可直接进行加减,即不需要判断,虽改进不大,确是不同的方式

class Solution {
public:
    string addBinary(string a, string b) {
        int lena=a.length();
        int lenb=b.length();
        if(lena==0){
            return b;
        }
        if(lenb==0){
            return a;
        }
        int count=0;
        if(lena<lenb){
            string tmp=a;
            a=b;
            b=tmp;
            int tmp1=lena;
            lena=lenb;
            lenb=tmp1;
        }
        int sum=0;
            for(int i=lenb-1,j=lena-1;i>=0;i--,j--){
                
                sum=a[j]-'0'+b[i]-'0'+count;
                if(sum==1){
                    a[j]='1';
                    count=0;;
                }
                else if(sum==2){
                    a[j]='0';
                    count=1;
                }else if(sum==3){
                    a[j]='1';
                    count=1;
                }

            }
            for(int j=lena-lenb-1;j>=0;j--){
                sum=a[j]-'0'+count;
                if(sum==0){
                    count=0;
                    break;
                }
                else if(sum==1){
                    a[j]='1';
                    count=0;
                    break;
                }
                else if(sum==2){
                    a[j]='0';
                    count=1;
                }
            }
            if(count==1){
                a='1'+a;
            }
        
        return a;
    }
};




<think>我们正在解决一个编译错误:未声明的标识符'Solution'根据引用[1]的内容,这种错误通常是因为在使用某个类(这里是Solution)之前没有它的声明或定义。在C++中,如果我们在一个.cpp文件中使用了一个类,那么这个类必须在当前文件(或通过头文件包含)中可见。用户的问题是在实现addBinary函数时遇到了'Solution'未声明的错误。我们假设用户有一个类Solution,其中有一个成员函数addBinary,但是在main.cpp或者使用它的地方没有包含Solution类的声明。解决方案:1.将Solution类的声明放在一个头文件中(例如solution.h)2.在需要使用Solution类的文件中包含这个头文件根据引用[1]的例子,我们可以这样组织:步骤:1.创建solution.h头文件,在其中声明Solution类。2.在solution.cpp中实现Solution类的成员函数(包括addBinary)。3.在main.cpp中包含solution.h,这样main.cpp中就可以使用Solution类了。下面是一个示例://solution.h#ifndefSOLUTION_H#defineSOLUTION_H#include<string>classSolution{public:std::stringaddBinary(std::stringa,std::stringb);//其他成员函数声明...};#endif//solution.cpp#include"solution.h"std::stringSolution::addBinary(std::stringa,std::stringb){//实现代码...}//main.cpp#include"solution.h"intmain(){Solutionsol;std::stringresult=sol.addBinary("11","1");//...return0;}注意:确保在编译时将solution.cpp和main.cpp一起编译。另外,引用[3]提到了关于循环包含和前置声明的问题,但这里我们只是简单的包含头文件,所以不会有循环包含的问题。如果头文件被多个文件包含,务必使用头文件保护(如#ifndef...#define...#endif)防止重复包含。如果用户已经这样做了,那么可能是其他原因,比如:-头文件路径不正确,导致包含失败-类名拼写错误(注意大小写)-函数声明和定义不一致(比如在类中声明了addBinary,但在定义时写错了函数名)但根据错误信息,最可能的原因是没有包含声明Solution类的头文件。因此,请检查在出现错误的地方(可能是main.cpp)是否包含了定义Solution类的头文件。如果用户是在同一个文件中定义和使用Solution类,那么请确保在使用之前定义了Solution类。例如://错误:在使用Solution之前没有定义intmain(){Solutionsol;//这里Solution未定义return0;}classSolution{//...};应该改为:classSolution{//...};intmain(){Solutionsol;//现在Solution已经定义return0;}但是通常我们推荐将类定义放在头文件中,然后在需要的地方包含。总结:检查是否在使用了Solution的地方包含了声明Solution的头文件,或者在使用之前定义了Solution类。</think>在 C++ 中遇到 "undeclared identifier 'Solution'" 编译错误,通常是由于类声明缺失或包含顺序问题导致的。以下是系统化的解决方案: ### 解决方案步骤 1. **创建头文件声明类**(关键步骤) ```cpp // Solution.h #pragma once // 防止重复包含 #include <string> class Solution { public: std::string addBinary(std::string a, std::string b); }; ``` 2. **在实现文件中包含头文件** ```cpp // addBinary.cpp #include "Solution.h" // 必须包含类声明 std::string Solution::addBinary(std::string a, std::string b) { // 函数实现... } ``` 3. **在主文件中正确包含** ```cpp // main.cpp #include "Solution.h" // 包含类声明 int main() { Solution sol; sol.addBinary("1010", "1100"); return 0; } ``` ### 常见错误原因及修复 | 错误类型 | 错误示例 | 修复方案 | |---------|---------|---------| | 缺失类声明 | 直接使用 `Solution` 未声明 | 创建头文件声明类[^1] | | 循环包含 | A.h 包含 B.h,B.h 又包含 A.h | 使用前置声明 `class Solution;`[^3] | | 头文件未保护 | 多次包含导致重定义 | 添加 `#pragma once` 或 `#ifndef` 保护 | | 实现文件未包含 | .cpp 文件未包含自己的头文件 | 在 .cpp 中添加 `#include "Solution.h"` | | 命名空间问题 | 类定义在未引用的命名空间 | 使用 `namespace::Solution` 或 `using namespace`[^2] | ### 编译指令 确保链接所有实现文件: ```bash g++ main.cpp addBinary.cpp -o program ``` ### 最佳实践建议 1. **头文件规范**: - 每个类单独头文件 - 包含防护(`#pragma once`) - 只放声明不放实现 2. **循环引用处理**(参考引用[3]): ```cpp // 前置声明解决循环依赖 class A; class B { public: void useA(A& a); }; // 在.cpp文件中包含A.h实现 #include "A.h" void B::useA(A& a) { a.method(); } ``` 3. **命名空间管理**(参考引用[2]): ```cpp namespace mylib { class Solution { // 类实现... }; } // 使用时 mylib::Solution sol; ``` > **关键点**:编译器需要在使用前看到完整的类声明。通过头文件分离声明与实现是 C++ 模块化的核心机制,能有效避免 "undeclared identifier" 错误[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值