LintCode(容易)二进制中有多少个1(错误集)

本文详细分析了LintCode一道关于二进制中1数量的题目中出现的错误,包括默认值问题、无限循环、C++的异或运算符误解以及负数处理的错误。通过讲解和修正这些bug,帮助读者理解相关知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误代码:
bug1:

int main(int num) {
    stringstream ss;
    ss << num; cout << num;
    string s1 = ss.str();  int timesof1 = 0;
    for (auto c : s1){
        if (c == '1'){
            timesof1++;
        }
    }
    //cout<< timesof1;
    system("pause");
}

就以上代码,发现:当没有向控制台输入num的值时,num的值默认为1.
然后百度:这里写图片描述

bug2:无限循环

for ( i = 1;2^i<=num ; i++){
        cout << s2<<endl;
                }
 ```

改正:

for ( i = 1;pow(2,i)<=num ; i++){
            cout << s2<<endl;
} 

原因:c++中^不表示幂次方,幂次方要用pow。
C++中^符号表示:这两个数的二进制按位异或运算。
bug3:
这里写图片描述

int two(int num){

    //num>1
    string s1("1"); string s2("1"); int i;
    //2 ^ i <= num < 2 ^ (i + 1)
    for ( i = 1;pow(2,i)<=num ; i++){
            for (auto &c : s1){
                c = c + 1; 
            }
            s2 = s2 + s1;
            s1 = s2;

    } cout << s2<<endl;
    int p = num - pow(2, i -1);// 
    int w = s2[p]-'0'; cout  << w;
    return w;
}
int main() {
    // write your code here
    int num; cin >> num;
    int timesof1 ;
    //num==0
    if (num == 0) timesof1 = 0;
    //num==1
    if (num == 1) timesof1 = 1;
    if (num>1)  
        timesof1=two(num);

    //cout<< timesof1;
    system("pause");
}

原因:
2147483647是2^31-1,则按照程序设定,string此时应该存有2^31-2^30=2^30位数据,LintCode说我的内存使用超过限制,但我查资料,string大小是没有限制的,而且下标是用int型存储的,最大值为2^31-1,大于string内存储数据个数,VS上运行不出来结果,没报错,但程序退出时返回值异常,不知道是不是内存泄漏之类的问题
这里写图片描述

bug4:
这里写图片描述
bug5:
这里写图片描述
原因:将负数转化为相应的正数,输入测试的时候,由于负数前面多一个为1 的符号位,所以要再加上1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值