diff --git a/maths/special_numbers/kaprekar_number.py b/maths/special_numbers/kaprekar_number.py new file mode 100644 index 000000000000..c62e901207a4 --- /dev/null +++ b/maths/special_numbers/kaprekar_number.py @@ -0,0 +1,38 @@ +import math + + +def is_kaprekar_number(number: int) -> bool: + """ + Determine whether a number is a Kaprekar number (excluding powers of 10). + + A Kaprekar number is a positive number such that: + number^2 = q * 10^m + r, for some m >= 1, q >= 0, 0 <= r < 10^m, + and number = q + r, with the restriction that it is not a power of 10. + + Args: + number (int): The number to check. + + Returns: + bool: True if it's a Kaprekar number, else False. + + Examples: + >>> is_kaprekar_number(45) + True + >>> is_kaprekar_number(9) + True + >>> is_kaprekar_number(10) + False + >>> is_kaprekar_number(1) + True + """ + if number == 1: + return True + if number <= 0 or math.log10(number).is_integer(): + return False # Disallow powers of 10 (e.g., 10, 100, 1000) + + square = str(number**2) + for i in range(1, len(square)): + left, right = square[:i], square[i:] + if number == int(left or "0") + int(right): + return True + return False diff --git a/tests/special_numbers/__init__.py b/tests/special_numbers/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/special_numbers/test_kaprekar_number.py b/tests/special_numbers/test_kaprekar_number.py new file mode 100644 index 000000000000..76e76c2cd0cc --- /dev/null +++ b/tests/special_numbers/test_kaprekar_number.py @@ -0,0 +1,19 @@ +from maths.special_numbers.kaprekar_number import is_kaprekar_number + + +def test_kaprekar_numbers(): + assert is_kaprekar_number(1) is True + assert is_kaprekar_number(9) is True + assert is_kaprekar_number(45) is True + assert is_kaprekar_number(55) is True + assert is_kaprekar_number(99) is True + assert is_kaprekar_number(297) is True + + +def test_non_kaprekar_numbers(): + assert is_kaprekar_number(10) is False # Power of 10 + assert is_kaprekar_number(100) is False # Power of 10 + assert is_kaprekar_number(3) is False + assert is_kaprekar_number(50) is False + assert is_kaprekar_number(0) is False + assert is_kaprekar_number(-45) is False