iai6月月赛丙组第2题

T2-二进制异或

题目描述

给定两个只包含 0,1 的二进制数字,请你求出两个数字异或以后的二进制值是多少?(两个数字异或是指其二进制形式下按位做异或运算)

所谓异或,是指不同值异或结果为1,相同值异或结果为0,即:
0 ⊕ 0 = 0 0⊕0=0 00=0
0 ⊕ 1 = 1 0⊕1=1 01=1
1 ⊕ 0 = 1 1⊕0=1 10=1
1 ⊕ 1 = 0 1⊕1=0 11=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了,所以说,这次数据是真的良心)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值