i'm adding 2 binary numbers inputted strings , outputting sum string in binary using method.
any thoughts on getting code work?
def add(a,b): = list(a) b = list(b) equalize(a,b) sum_check(a,b,ctr) out = " ".join(str(x) x in sum_check(a,b,ctr)) out.replace(" ","") print(out) def equalize(a,b): if len(a) > len(b): in range(0, len(a)-len(b)): b.insert(0,'0') elif len(a) < len(b): in range(0, len(b)-len(a)): a.insert(0,'0') def sum_check(a,b): out = [] ctr = 0 def sum(a, b): if ctr > 0: if a[-1] + b[-1] == 2: out.append('1') elif a[-1] + b[-1] == 0: out.append('1') ctr -= 1 else: # a[-1] + b[-1] = 1 out.append('0') ctr -= 1 else: # ctr = 0 if a[-1] + b[-1] == 2: out.append('1') ctr += 1 elif a[-1] + b[-1] == 0: out.append('0') else: # a[-1] + b[-1] = 1 out.append('1') in range(len(a)): if == 0: sum(a,b) else: new_a = a[:-1] new_b = b[:-1] sum(new_a, new_b) return out
your algorithm not simple (i rewrite completely; @ least give functions , variables more explicit names in order understand algorithm again quicker later, ctr
should anyhow explicitely relate carrying etc.).
nevertheless, here is, corrected , working. have inserted comments @ places changed things (either errors in algorithm, or python programming errors).
i have put def sum(...)
outside sum_check
, it's clearer way.
though should know sum
python builtin, should find name, avoid losing builtin in namespace (but guess algorithm training purpose, since replace operation on binary numbers directly:
$ python3 python 3.4.3 (default, oct 14 2015, 20:28:29) [gcc 4.8.4] on linux type "help", "copyright", "credits" or "license" more information. >>> = int('10110', 2) >>> b = int('1011100', 2) >>> bin(a + b) '0b1110010' >>>
).
also, have left debugging print
statements, see happens. plus example check cases gone through.
last note: first crashed because used ctr
before had defined it. first thing correct.
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def equalize(a, b): if len(a) > len(b): in range(0, len(a) - len(b)): b.insert(0, 0) elif len(a) < len(b): in range(0, len(b) - len(a)): a.insert(0, 0) return a, b def sum(a, b, ctr): out = '' print('\n'.join(['-------', 'working on:', str(a), str(b)])) if ctr > 0: if a[-1] + b[-1] == 2: out = '1' print('case 1') elif a[-1] + b[-1] == 0: out = '1' ctr -= 1 print('case 2') else: # a[-1] + b[-1] = 1 out = '0' print('case 3') # ctr -= 1 (wrong) else: # ctr = 0 if a[-1] + b[-1] == 2: out = '0' # '1' wrong ctr += 1 print('case 4') elif a[-1] + b[-1] == 0: out = '0' print('case 5') else: # a[-1] + b[-1] = 1 out = '1' print('case 6') print('sum return: ' + str(out) + ' , carry: ' + str(ctr) + '\n-------') return out, ctr def sum_check(a, b): ctr = 0 out = [] n = len(a) in range(n): if != 0: # giving same , b feed sum(). # in order change them, it's not advised iterate on # changing list (maybe not possible), stored desired # length in number n. then, assign new values , b. = a[:-1] b = b[:-1] new_out, ctr = sum(a, b, ctr) out.append(new_out) print('current out: ' + str(out) + ' , carry: ' + str(ctr)) return out def add(a, b): = [int(x) x in a] b = [int(x) x in b] # need return new contents of , b, otherwise you'll keep # them before call equalize() a, b = equalize(a, b) print('\n'.join(['equalized: ', str(a), str(b)])) # on next line, [::-1] reverses result (your algorithm returns # result read right left) print('result: ' + ''.join(sum_check(a, b)[::-1])) add('10110', '1011100')
output:
equalized: [0, 0, 1, 0, 1, 1, 0] [1, 0, 1, 1, 1, 0, 0] ------- working on: [0, 0, 1, 0, 1, 1, 0] [1, 0, 1, 1, 1, 0, 0] case 5 sum return: 0 , carry: 0 ------- current out: ['0'] , carry: 0 ------- working on: [0, 0, 1, 0, 1, 1] [1, 0, 1, 1, 1, 0] case 6 sum return: 1 , carry: 0 ------- current out: ['0', '1'] , carry: 0 ------- working on: [0, 0, 1, 0, 1] [1, 0, 1, 1, 1] case 4 sum return: 0 , carry: 1 ------- current out: ['0', '1', '0'] , carry: 1 ------- working on: [0, 0, 1, 0] [1, 0, 1, 1] case 3 sum return: 0 , carry: 1 ------- current out: ['0', '1', '0', '0'] , carry: 1 ------- working on: [0, 0, 1] [1, 0, 1] case 1 sum return: 1 , carry: 1 ------- current out: ['0', '1', '0', '0', '1'] , carry: 1 ------- working on: [0, 0] [1, 0] case 2 sum return: 1 , carry: 0 ------- current out: ['0', '1', '0', '0', '1', '1'] , carry: 0 ------- working on: [0] [1] case 6 sum return: 1 , carry: 0 ------- current out: ['0', '1', '0', '0', '1', '1', '1'] , carry: 0 result: 1110010
Comments
Post a Comment