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

来源:互联网 发布:linux怎么看网关 编辑:程序博客网 时间:2024/06/02 19:48

错误代码:
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.

0 0
原创粉丝点击