LintCode(容易)二进制求和遇到的bug
来源:互联网 发布:谷歌联盟知乎 编辑:程序博客网 时间:2024/05/20 13:39
之前错误代码
#include<iostream>#include<string>#include<vector>#include <initializer_list>using std::initializer_list;using std::vector;using std::string;using std::cin;using std::cout;using std::endl;string addBinary(string& a, string& b) { string lg, st; lg = (a.size() > b.size()) ? a : b;// cout << a.size()<<endl<<b.size()<<endl<<lg<<endl; st = (lg == a) ? b : a; //cout << st; string::size_type n = lg.size(); string answer(n, '0'); for (string::size_type i = st.size() - 1; i >= 0; i--){ for (string::size_type m = lg.size() - 1; m >=m- i - 1; m--){ if (st[i] + lg[m] + answer[m+1] >= 2){ answer[m] = (answer[m + 1] + st[i] + lg[m]) / 2; answer[m + 1] = (answer[m + 1] + st[i] + lg[m]) %2; } cout << i << endl << m; } } if (answer[0] == 0){ answer = answer.substr(1, n); } return answer;}int main(){ string a,b,answer; cin >> a >> b; answer= addBinary(a, b); cout << answer; system("pause");}
结果:死循环,下标越界
bug1:
string::size_type i = 3;// st.size() - 1; string::size_type m = 5; //lg.size() - 1; for (; i >= 0; i--,m--){ /* if (;st[i] + lg[m] + answer[m+1] >= 2){ answer[m] = (answer[m + 1] + st[i] + lg[m]) / 2; answer[m + 1] = (answer[m + 1] + st[i] + lg[m]) %2; }*/ cout <<i<<m << endl ; }
其中错误点在:
for (; i >= 0; i--,m--){}
改正后
for (; i >= 1; i--,m--){}
原因:string::size_type是unsigned型,通俗点,都是整数,从0循环到4 294 967 295,即32位的无符号数的最大值(UMax),所以总是>=0。
bug2:
string a,b;string::size_type i = 3;// st.size() - 1; string::size_type m = 5; //lg.size() - 1; int jinwei = 0; //lg[m],st[i],answer[m+1] jinwei = ( st[i] + lg[m]) / 2; answer[m + 1] = ( st[i] + lg[m]+jinwei) %2; //lg[m-1],st[i-1],answer[m] for (; i >= 1; i--,m--){ // if (st[i] + lg[m] +jinwei >= 2){ //jinwei = ( st[i-1] + lg[m-1]) / 2; // answer[m ] = (jinwei + st[i-1] + lg[m-1]) %2; // } cout <<i-1<<m-1<< endl ; }
其中错误点在于:
string a,b;jinwei = ( st[i] + lg[m]) / 2; answer[m + 1] = ( st[i] + lg[m]+jinwei) %2;
原因:
第一:string a,b为空字符串。
第二:将a,b初始化后,
string a(7,’0’);
string b(8, ‘1’);
cout<
int p = int(st[i]-'0'); int q = int(lg[m] - '0'); jinwei = (p+q) / 2; answer[m + 1] =( (p + q + jinwei) % 2+'0');
此时jinwei和answer的输出为int型了。
bug3:
//由于如果i>=0,程序死循环,所以最高位处进位额外计算。 int p = int(st[0] - '0'); int q = int(lg[0] - '0'); jinwei = (p + q) / 2; answer[0] = ((p + q + jinwei) % 2 + '0');
改正一(还是有错的):
int p = int(st[0] - '0'); int q = int(lg[w] - '0'); jinwei = (p + q) / 2; answer[w + 1] = ((p + q + jinwei) % 2 + '0'); answer[w ] = jinwei; //cout << answer[w + 1]; //cout << w ;
原因:之前逻辑错误,正确思路应分两部分,一部分为st.size(), 另一部分为lg.size()-st.size()。
此处只计算了最高位,比如,lg(“11111”),st(“11”), 则第一个循环计算后结果是:answer=”11110”, 第二个循环计算后结果才是正确答案。
bug4:
for (; i >= 1; i--,m--){ //if (st[i]-'0' + lg[m]-'0' +jinwei >= 2){ jinwei = (st[i - 1] - '0' + lg[m - 1] - '0') / 2; answer[m ] = ((jinwei + st[i-1]-'0' + lg[m-1]-'0') %2+'0'); }
改正:
for (;i!=-1; i--,m--){ answer[m + 1] = ((jinwei + st[i] - '0' + lg[m] - '0') % 2 + '0'); jinwei = (st[i] - '0' + lg[m] - '0' + jinwei) / 2; }
原因:
我们计算是从lg、st两个字符串最后一位开始计算,所以应该先算answer[m+1], 然后计算jinwei.
bug5:结果错误
for (; w != 0; w--){ cout << answer << endl; cout << answer[w - 1] << ',' << jinwei << endl; answer[w-1] = (answer[w-1]-'0' + jinwei) % 2+'0'; jinwei = (answer[w-1]-'0' + jinwei) / 2; }
测试用例:
string a("11111"); string b("11");
此部分代码测试结果:
改正:
for (; w != -1; w--){ int p = answer[w] - '0'; answer[w ] = (p + jinwei) % 2 + '0'; jinwei = (p + jinwei) / 2; }
原因:
1.最初代码,w没有取到0.
2.answer[w]的值在 answer[w ] = (p + jinwei) % 2 + '0';
jinwei = (p + jinwei) / 2;
这两个表达式中相同
bug6:
程序没有执行此代码
if (answer[0] == 0){ answer = answer.substr(1, m); cout << answer << endl; }
原因:answer[0]为char型,值为48,当然!=0,所以也就没执行这段代码,另外需注意substr(1,m)是指从下标为1开始截取(包括1),截取m个!
改正:
if (answer[0]-'0' == 0)
- LintCode(容易)二进制求和遇到的bug
- LintCode【容易】二进制求和
- LintCode(容易)二进制求和
- 容易 二进制求和
- LintCode-二进制求和
- LIntCode-二进制求和
- 二进制求和(LintCode)
- lintcode ----二进制求和
- LintCode之二进制求和
- Lintcode 408 二进制求和
- 二进制求和,lintcode
- LintCode | 408. 二进制求和
- LintCode 二进制求和
- lintcode --二进制求和
- Lintcode二进制求和
- 二进制求和-LintCode
- LintCode Add Binary 二进制求和
- lintcode add-binary 二进制求和
- Freemark报错item undefined,代码无问题,环境问题。
- hdu 1588 Gauss Fibonacci(斐波那契,等比数列求和,矩阵快速幂)
- JDBC连接数据库
- js动态添加事件-事件委托
- spring(十):为特定的类引入新的功能
- LintCode(容易)二进制求和遇到的bug
- 【顶】开启新的篇章
- 生成随机数方法:java.util.Random.nextInt(int n)方法实例
- servlet中的url-pattern
- 传统的JDBC实现的DAO插入和读取
- HDFS详解
- 2017届网易内推码
- [引用]SQL经典面试题及答案
- spring jdbc模板