pythonfunctionbinarydivisiontruncated

Conversion of denary number to binary number problem (Python)


Im stuck on a problem where I have to write a function that converts a denary number into a binary number using the repeated division by two algorithm. Steps Include:

Please click the link below to see what the output should be like: https://i.sstatic.net/pifUO.png

def dentobi(user):
  denary = user
  divide = user / 2
  remainder = user % 2
  binary = remainder
  
  if user != 0:
    print("Denary:", denary)
    print("Divide by 2:", divide)
    print("Remainder:", remainder)
    print("Binary:", binary)
  
user = int(input("Please enter a number: "))
dentobi(user)

This is what I have done so far but Im not getting anywhere.

Can someone explain how I would do this?


Solution

  • The Answer provided by @user2390182 is functionally correct except that it returns an empty string when num is zero. However, I have noted on several occasions that divmod() is rather slow. Here are three slightly different techniques and their performance statistics.

    import time
    
    # This is the OP's original code edited to allow for num == 0
    def binaryx(num):
        b = ""
        while num:
            num, digit = divmod(num, 2)
            b = f"{digit}{b}"
        return b or '0'
    
    # This is my preferred solution
    def binaryo(n):
        r = []
        while n > 0:
            r.append('1' if n & 1 else '0')
            n >>= 1
        return ''.join(reversed(r)) or '0'
    
    # This uses techniques suggested by my namesake
    def binaryy(n):
        r = ''
        while n > 0:
            r = str(n & 1) + r
            n >>= 1
        return r or '0'
    
    M = 250_000
    
    for func in [binaryx, binaryo, binaryy]:
        s = time.perf_counter()
        for _ in range(M):
            func(987654321)
        e = time.perf_counter()
        print(f'{func.__name__} -> {e-s:.4f}s')
    

    Output:

    binaryx -> 1.3817s
    binaryo -> 0.9861s
    binaryy -> 1.6052s