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