2 条题解
-
1
考虑使用位运算,即二进制加法。
对于下面的四种情况:
- (无进位)
- (无进位)
- (无进位)
- (有进位)
我们可以发现,对于某一位,最终的运算结果即为异或运算的结果。
而对于进位操作,我们只需要通过与运算得出需要进位的数位,再进行左移一位的操作即可。
但是这里还有一个小问题:因为不能使用
+号,我们无法通过一次运算得出最终结果。解决方法也很简单,我们可以重复进行上述操作,每次将进位当作下一轮的 “被加数”,直到在某一次操作中的进位为
0,此时得到的数即为运算结果。至此,这道题就做完了,但是在写代码的时候还要注意一个细节:
- 对于负数进行左移操作是未定义行为,因此在输入时要使用
unsigned类型,输出时再转成signed类型。
代码如下:
#include <iostream> using namespace std; unsigned a,b; int main(){ cin>>a>>b; while(b){ unsigned carry=(a&b)<<1; a^=b; b=carry; } cout<<(signed)a; return 0; }
- 1
信息
- ID
- 1258
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 64
- 已通过
- 30
- 上传者