两个二进制字符串的计数器C ++

时间:2015-11-07 15:15:42

标签: string count binary

我正在尝试从字符串中计算两个二进制数。最大计数位数必须是253.短数字有效,但当我添加一些更长的数字时,输出错误。不良结果的示例是“10100101010000111111”,其中“000011010110000101100010010011101010001101011100000000111000000000001000100101101111101000111001000101011010010111000110”。

#include <iostream>
#include <stdlib.h>
using namespace std;

bool isBinary(string b1,string b2);

int main()
{
string b1,b2;
long binary1,binary2;
int i = 0, remainder = 0, sum[254];

cout<<"Get two binary numbers:"<<endl;
cin>>b1>>b2;
binary1=atol(b1.c_str());
binary2=atol(b2.c_str());
if(isBinary(b1,b2)==true){
    while (binary1 != 0 || binary2 != 0){

    sum[i++] =(binary1 % 10 + binary2 % 10 + remainder) % 2;
    remainder =(binary1 % 10 + binary2 % 10 + remainder) / 2;
    binary1 = binary1 / 10;
    binary2 = binary2 / 10;
    }

    if (remainder != 0){
    sum[i++] = remainder;
    }
    --i;
    cout<<"Result: ";

    while (i >= 0){
    cout<<sum[i--];
    }
    cout<<endl;

}else cout<<"Wrong input"<<endl;

return 0;
}

   bool isBinary(string b1,string b2){
    bool rozhodnuti1,rozhodnuti2;

     for (int i = 0; i < b1.length();i++) {
       if (b1[i]!='0' && b1[i]!='1') {
        rozhodnuti1=false;
        break;
    }else rozhodnuti1=true;
}

for (int k = 0; k < b2.length();k++) {
    if (b2[k]!='0' && b2[k]!='1') {
        rozhodnuti2=false;
        break;
    }else rozhodnuti2=true;
}

 if(rozhodnuti1==false || rozhodnuti2==false){ return false;}
 else{ return true;}
 }

1 个答案:

答案 0 :(得分:0)

其中一个问题可能在这里:sum[i++]
该表达式首先返回i的值,然后将其增加1。

你是在purporse上做的吗? 将其更改为++i

如果您还可以发布“错误”输出,这将有所帮助,以便我们可以尝试从它开始向后移动代码。

编辑2015-11-7_17:10

为了确保一切正确,我已经添加cout来检查binary1binary2包含atol函数的结果后包含的内容:它们包含整数54728448718333230,这显然不代表您在帖子中显示的两个01字符串的正确二进制到整数的转置。
可能他们在某种程度上超过了atol的容量。

此外,你的“数学”操作的结果带来了一个更奇怪的结果,即6011111101,这显然没有任何意义。

当你说count这两个数字时,你的意思是什么?也许你想赚一笔钱?我猜就是这样。
但是,再说一遍,你得到的是两个带符号的整数而不是两个二进制数,这意味着那些%10%2操作被(可能)误用了。

编辑2015-11-07_17:20

我试过用小二进制字符串来运行你的程序,它实际上有效;用小二进制字符串。
这是一个事实(?),atol无法处理长的数字字符串。

我的建议:使用char数组而不是字符串,并将01字符替换为您可以执行所有操作的数值(if (bin1[i]){bin1[i]=1;}else{bin1[i]=0})你想要的数学运算(毕竟你已经编写了一个有效的sum函数)。

完成数学运算后,您只需将char数组转换回屏幕上01cout的实际字符。

编辑2015-11-07_17:30

我自己测试atol:它只能正确转换长达10个字符的字符串 超出第10个角色的任何东西都会让这个功能变得疯狂。