## Issue

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:

- The number to be converted is divided by two.
- The remainder from the division is the next binary digit. Digits are added to the front of the sequence.
- The result is truncated so that the input to the next division by two is always an integer.
- The algorithm continues until the result is 0.

Please click the link below to see what the output should be like:

https://i.stack.imgur.com/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
```

Answered By – Arthur King

Answer Checked By – David Goodson (BugsFixing Volunteer)