python - adding binary numbers without converting to decimal or using built in functions -


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