求下列題目程式碼
數位電路模擬
數位IC輸入m 是二進位 8 位元,輸出是二進位 4 位元。
輸入範圍從 00000000 到 11111111 (十進位 0-255)。
輸出範圍從 0000 到 1111 (十進位 0-15)
數位IC內有一個回饋電路接收輸入m,視為一個函數C(m),其回饋方式如下:
1 若m為偶數(十進位),則C(m) = C(m/2)
2 若m為奇數(十進位),則C(m) = C((m+1)/2)
3 若m = 1,則回饋電路結束
數位IC內有一個紀錄器,會記錄回饋電路的回饋次數。
R(m) = [C(m)的回饋次數],例如:R(10) = 4。
數位IC的輸出為紀錄器所記錄之回饋電路的回饋次數。
數位IC範例說明:
1 00001010 輸入二進位8位元m (十進位為10)
2 進入回饋電路C(10)
3 10為偶數,因此第一輪回饋為C(10) = C(5)
4 5為奇數,因此第二輪回饋為C(5) = C(3)
5 3為奇數,因此第二輪回饋為C(3) = C(2)
6 2為奇數,因此第二輪回饋為C(2) = C(1)
7 m=1,因此回饋電路結束
8. 總計回饋4次,因此輸出0100(十進位為4)
題目要求:
1 設計數位IC的function
2 主程式中可接受多組輸入,並經過數位IC後,一次輸出所有數位IC的輸出結果
輸入說明:
可接受多組二進位8位元的輸入m,每組輸入以隔行區隔,直到輸入-1後停止輸入。
輸出說明:
輸出每組二進位8位元的輸入m進入數位IC後的輸出結果,每組輸出以隔行區隔。
Note:切勿輸入一組m後就印出數位IC結果,請於輸入-1後才一次印出所有結果
輸入範例:
00000000
11111111
00000001
10000000
00111111
-1
輸出範例:
0000
1000
0000
0111
0110
>>> def ic(*args):
for m in args:
m = int(m, base=2)
r = 0
while m > 1:
m = (m+m%2)//2
r += 1
r = bin(r)[2:]
print(r.zfill(4))
>>> def test():
args = list()
while True:
din = input().strip()
if din == '-1':
break
else:
args.append(din)
ic(*args)
>>> test()
00000000
11111111
00000001
10000000
00111111
-1
0000
1000
0000
0111
0110