我正在尝试从字符串中计算两个二进制数。最大计数位数必须是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;}
}
答案 0 :(得分:0)
其中一个问题可能在这里:sum[i++]
该表达式首先返回i
的值,然后将其增加1。
你是在purporse上做的吗?
将其更改为++i
。
如果您还可以发布“错误”输出,这将有所帮助,以便我们可以尝试从它开始向后移动代码。
为了确保一切正确,我已经添加cout
来检查binary1
和binary2
包含atol
函数的结果后包含的内容:它们包含整数547284487
和18333230
,这显然不代表您在帖子中显示的两个01
字符串的正确二进制到整数的转置。
可能他们在某种程度上超过了atol
的容量。
此外,你的“数学”操作的结果带来了一个更奇怪的结果,即6011111101
,这显然没有任何意义。
当你说count
这两个数字时,你的意思是什么?也许你想赚一笔钱?我猜就是这样。
但是,再说一遍,你得到的是两个带符号的整数而不是两个二进制数,这意味着那些%10
和%2
操作被(可能)误用了。
我试过用小二进制字符串来运行你的程序,它实际上有效;用小二进制字符串。
这是一个事实(?),atol
无法处理长的数字字符串。
我的建议:使用char
数组而不是字符串,并将0
和1
字符替换为您可以执行所有操作的数值(if (bin1[i]){bin1[i]=1;}else{bin1[i]=0}
)你想要的数学运算(毕竟你已经编写了一个有效的sum
函数)。
完成数学运算后,您只需将char
数组转换回屏幕上0
及1
和cout
的实际字符。
我自己测试atol
:它只能正确转换长达10个字符的字符串
超出第10个角色的任何东西都会让这个功能变得疯狂。