0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

全加算器 Python3編

Posted at

繰り上がりのある問題。
まあ、ヒントがあったのでその通りに答えたら正解だった。

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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?