我需要编写将比较2个二进制数并返回结果的程序 我使用XOR编写了这段代码,但是idk如何改进我的代码,所以例如100101和101001将返回一个<湾你可以帮我解决这个问题吗?
Option
答案 0 :(得分:0)
让a = 01, b = 10
。
在您的计划中,在第一次迭代中,a[i]^b[i]
的值将为1
。但a[i] < b[i]
并且您没有考虑到这种情况,因此x
的值仍为0
。
在第二次迭代中,XOR条件再次为真,条件(a[i] > b[i])
也为真,从而将x
的值增加到1
。
在循环之后,它将打印01 > 10
,这显然是错误的。
修改后的代码:
#include <iostream>
int main() {
std::string a, b;
std::cin >> a >> b;
int la = a.length(), lb = b.length();
int x = 0;
// -1 if both are equal
// 0 if a > b
// 1 if b > a
int flag = -1;
// if you only want to check for equal length strings
if (la == lb)
{
for (int i = 0; i < la; i++)
{
if (a[i]^b[i] == 1)
{
if(a[i] > b[i])
flag = 0;
else
flag = 1;
break;
}
}
if (flag == 0)
std::cout << a << " > " << b << std::endl;
if (flag == 1)
std::cout << a << " < " << b << std::endl;
if (flag == -1)
std::cout << a << " = " << b << std::endl;
}
}
答案 1 :(得分:0)
猜猜这会更好 除非它们相等,否则不需要迭代整个字符串。 只需找到第一个'1',而之前有1个的那个将更大。 就这么简单
int main()
{
string a,b;
cin>>a>>b;
size_t aLoc=-1,bLoc=-1;
do
{
aLoc = a.find("1",aLoc+1);
bLoc = b.find("1",bLoc+1);
if(aLoc<bLoc)
{
cout<<a<<">"<<b;
return 0;
}
else if(aLoc>bLoc)
{
cout<<a<<"<"<<b;
return 0;
}
}while(aLoc==bLoc && aLoc!=string::npos);
cout<<a<<"="<<b;
return 0;
}
编辑:
aLoc在第一个字符串中给出1的位置,为第二个字符串给出bLoc的位置 让我们看看1 exmaple
a = 10111000;
这里首先aLoc = 1,因为第一个'1'在位置1
b = 10001100;
这里bLoc = 1;
现在进行下一次迭代, aLoc将为3,因为下一个'1'位于第3位
和bLoc将是5自然aLoc
这意味着'1'在字符串a中排在第一位。
因此
if(aLoc<bLoc)
a>b;