Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,6 @@
* [Binary To Octal](conversions/binary_to_octal.py)
* [Decimal To Any](conversions/decimal_to_any.py)
* [Decimal To Binary](conversions/decimal_to_binary.py)
* [Decimal To Binary Recursion](conversions/decimal_to_binary_recursion.py)
* [Decimal To Hexadecimal](conversions/decimal_to_hexadecimal.py)
* [Decimal To Octal](conversions/decimal_to_octal.py)
* [Energy Conversions](conversions/energy_conversions.py)
Expand Down
67 changes: 59 additions & 8 deletions conversions/decimal_to_binary.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
"""Convert a Decimal Number to a Binary Number."""


def decimal_to_binary(num: int) -> str:
def decimal_to_binary_iterative(num: int) -> str:
"""
Convert an Integer Decimal Number to a Binary Number as str.
>>> decimal_to_binary(0)
>>> decimal_to_binary_iterative(0)
'0b0'
>>> decimal_to_binary(2)
>>> decimal_to_binary_iterative(2)
'0b10'
>>> decimal_to_binary(7)
>>> decimal_to_binary_iterative(7)
'0b111'
>>> decimal_to_binary(35)
>>> decimal_to_binary_iterative(35)
'0b100011'
>>> # negatives work too
>>> decimal_to_binary(-2)
>>> decimal_to_binary_iterative(-2)
'-0b10'
>>> # other floats will error
>>> decimal_to_binary(16.16) # doctest: +ELLIPSIS
>>> decimal_to_binary_iterative(16.16) # doctest: +ELLIPSIS
Traceback (most recent call last):
...
TypeError: 'float' object cannot be interpreted as an integer
>>> # strings will error as well
>>> decimal_to_binary('0xfffff') # doctest: +ELLIPSIS
>>> decimal_to_binary_iterative('0xfffff') # doctest: +ELLIPSIS
Traceback (most recent call last):
...
TypeError: 'str' object cannot be interpreted as an integer
Expand Down Expand Up @@ -52,7 +52,58 @@ def decimal_to_binary(num: int) -> str:
return "0b" + "".join(str(e) for e in binary)


def decimal_to_binary_recursive(decimal: int) -> str:
"""
Take a positive integer value and return its binary equivalent.
>>> decimal_to_binary_recursive(1000)
'1111101000'
>>> decimal_to_binary_recursive("72")
'1001000'
>>> decimal_to_binary_recursive("number")
Traceback (most recent call last):
...
ValueError: invalid literal for int() with base 10: 'number'
"""
decimal = int(decimal)
if decimal in (0, 1): # Exit cases for the recursion
return str(decimal)
div, mod = divmod(decimal, 2)
return decimal_to_binary_recursive(div) + str(mod)


def decimal_to_binary_recursive_main(number: str) -> str:
"""
Take an integer value and raise ValueError for wrong inputs,
call the function above and return the output with prefix "0b" & "-0b"
for positive and negative integers respectively.
>>> decimal_to_binary_recursive_main(0)
'0b0'
>>> decimal_to_binary_recursive_main(40)
'0b101000'
>>> decimal_to_binary_recursive_main(-40)
'-0b101000'
>>> decimal_to_binary_recursive_main(40.8)
Traceback (most recent call last):
...
ValueError: Input value is not an integer
>>> decimal_to_binary_recursive_main("forty")
Traceback (most recent call last):
...
ValueError: Input value is not an integer
"""
number = str(number).strip()
if not number:
raise ValueError("No input value was provided")
negative = "-" if number.startswith("-") else ""
number = number.lstrip("-")
if not number.isnumeric():
raise ValueError("Input value is not an integer")
return f"{negative}0b{decimal_to_binary_recursive(int(number))}"


if __name__ == "__main__":
import doctest

doctest.testmod()

print(decimal_to_binary_recursive_main(input("Input a decimal number: ")))
53 changes: 0 additions & 53 deletions conversions/decimal_to_binary_recursion.py

This file was deleted.