T2-二进制异或
题目描述
给定两个只包含 0,1 的二进制数字,请你求出两个数字异或以后的二进制值是多少?(两个数字异或是指其二进制形式下按位做异或运算)
所谓异或,是指不同值异或结果为1,相同值异或结果为0,即:
0
⊕
0
=
0
0⊕0=0
0⊕0=0
0
⊕
1
=
1
0⊕1=1
0⊕1=1
1
⊕
0
=
1
1⊕0=1
1⊕0=1
1
⊕
1
=
0
1⊕1=0
1⊕1=0
输入格式
输入共两行,每行一个二进制数字
输出格式
输出共一行,一个二进制数字表示答案
数据范围
对于
50
%
50 \%
50%的数据,输入的二进制数字长度不超过7位
对于
100
%
100 \%
100%的数据,输入的二进制数字长度不超过100位
注意:输入的两个二进制数字长度可能不相同
样例数据
输入1:
1101
1110
输出1:
11
说明1:
按位异或的答案为0011,去掉前导0后即为11
输入2:
100101
1010
输出2:
101111
分析
这题是要我们求两个二进制数异或后的值。首先我们需要知道异或是怎么算的。题目中已经给出:相同为0,不同为1。因此我们可以用两个字符串
s
1
s_1
s1 和
s
2
s_2
s2 来表示两个二进制数, 然后用第三个字符串
s
s
s 记录最终异或的答案。注意:输入的两个二进制数字长度可能不相同!此时应该在较短的数前面补0。同时,异或时要从数的末尾开始一一匹配,然后进行运算,不是从头开始的!!! 最后,因为有前导0的存在,我们需要写一个删除前导0的while语句,最后输出 ,完事儿,下班!。
OK!上代码!
#include <bits/stdc++.h>
#define int long long
using namespace std;
string s1, s2, s;
signed main(){
cin >> s1 >> s2;
int l1 = s1.size(), l2 = s2.size();
if (l1 > l2){//帮短的数补0使它变长
for (int i = 1; i <= l1 - l2; ++i)
s2 = '0' + s2;
l2 = l1;
}
else if (l1 < l2){
for (int i = 1; i <= l2 - l1; ++i)
s1 = '0' + s1;
l1 = l2;
}
for (int i = 0; i < l1; ++i){//打工仔异或工作中
if (s1[i] == s2[i])
s += '0';
else
s += '1';
}
int l = s.size();
while (s[0] == '0'){//删除影响我们AC的前导0
for (int i = 0; i < l - 1; ++i)
s[i] = s[i + 1];
l--;
}
if (s == '')//判断一下s是否是空的
cout << 0 << endl;
else {//正常情况,正常输出,完美!
for (int i = 0; i < l; ++i)
cout << s[i];
cout << endl;
}
return 0;
}
等等,还没完呢!如果
s
s
s 里面都是0该咋办?一删不就空了吗!还咋输出啊?!此时应该请特判同学出场······如果
s
s
s 是空的,那么就输出0。(值得一提的是,我在前一个程序上并没有写特判,但我还是AC了,所以说,这次数据是真的良心)