繰り上がりのある問題。
まあ、ヒントがあったのでその通りに答えたら正解だった。
a, b,C_1= map(int, input().split())
s_y = a ^ b
c_x = a & b
s = s_y ^ C_1
c_y = s_y & C_1
c_2 = c_x | c_y
print(c_2, s)
さて。
なんでこう考えたら正解になるのか。
(C_1:繰り上がり)
A_2 A_1
+ B_2 B_1
============
C_2 S_2 S_1
ちなみに半加算器はこれ
(C_1:繰り上がり)
A_1
+ B_1
============
C_1 S_1
まず普通の計算と同じように考えると混乱する。
今やっているのは、1桁の計算ではなく、その次の桁の計算。
※Sというのは2桁の計算の合計と3桁に繰り上がったC。
(A+B)+C1と普通に考えれば解けるが算術で計算したらだめ。
A + Bの結果であるs_yと、繰り上がりC_1を足してSが求まっている。
で、今A+Bの繰り上がりc_xと (A+B)+Cの繰り上がりc_yがあるが、
たとえば
C_2が1になりそうな場合というのは
1)A_2 + B_2で繰り上がり
2)A_2 + B_2の合計と、繰り上がりC1で繰り上がり
3)1)と2)の両方 ⇒> A_2とB_2で繰り上がりが発生したら0になり、
合わせても繰り上がらない
だから、1)or 2)になればOKなので、c_x | c_y としている
繰り返しがあるので関数にしてしまうとよい
a, b, c1 = map(int, input().split())
# 半加算器のプログラム
def halfAdder(a, b):
c = a & b
s = a ^ b
return (c, s)
cx, sy = halfAdder(a, b)
cy, s = halfAdder(sy, c1)
c2 = cx ^ cy
print(c2, s)