From f22fe4812d8816c96271b1213963e8d8c649c48a Mon Sep 17 00:00:00 2001 From: NA-V10 Date: Fri, 21 Nov 2025 16:24:50 +0530 Subject: [PATCH 1/2] feat: add count_bits algorithm with doctests --- bit_manipulation/count_bits.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 bit_manipulation/count_bits.py diff --git a/bit_manipulation/count_bits.py b/bit_manipulation/count_bits.py new file mode 100644 index 000000000000..e5d36c94eba2 --- /dev/null +++ b/bit_manipulation/count_bits.py @@ -0,0 +1,31 @@ +def count_bits(n: int) -> int: + """ + Count the number of set bits (1s) in the binary representation of a + non-negative integer. + + Examples: + >>> count_bits(0) + 0 + >>> count_bits(1) + 1 + >>> count_bits(5) # 101 + 2 + >>> count_bits(15) # 1111 + 4 + >>> count_bits(16) # 10000 + 1 + """ + if n < 0: + raise ValueError("Input must be non-negative") + + count = 0 + while n > 0: + count += n & 1 + n >>= 1 + + return count + + +if __name__ == "__main__": + import doctest + doctest.testmod() From 836864c51bc7d3a35bf9be204492c0f4452b1261 Mon Sep 17 00:00:00 2001 From: NA-V10 Date: Fri, 21 Nov 2025 16:50:56 +0530 Subject: [PATCH 2/2] feat: add integer_to_roman algorithm with doctests --- strings/integer_to_roman.py | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 strings/integer_to_roman.py diff --git a/strings/integer_to_roman.py b/strings/integer_to_roman.py new file mode 100644 index 000000000000..023cc6608742 --- /dev/null +++ b/strings/integer_to_roman.py @@ -0,0 +1,51 @@ +def integer_to_roman(n: int) -> str: + """ + Convert an integer to a Roman numeral. + + Examples: + >>> integer_to_roman(1) + 'I' + >>> integer_to_roman(4) + 'IV' + >>> integer_to_roman(9) + 'IX' + >>> integer_to_roman(58) + 'LVIII' + >>> integer_to_roman(1994) + 'MCMXCIV' + >>> integer_to_roman(0) + Traceback (most recent call last): + ... + ValueError: number must be between 1 and 3999 + """ + if not (1 <= n <= 3999): + raise ValueError("number must be between 1 and 3999") + + symbols = [ + (1000, "M"), + (900, "CM"), + (500, "D"), + (400, "CD"), + (100, "C"), + (90, "XC"), + (50, "L"), + (40, "XL"), + (10, "X"), + (9, "IX"), + (5, "V"), + (4, "IV"), + (1, "I"), + ] + + result = [] + for value, numeral in symbols: + while n >= value: + result.append(numeral) + n -= value + + return "".join(result) + + +if __name__ == "__main__": + import doctest + doctest.testmod()