Skip to content

Commit 8cd61c3

Browse files
author
Eraoll
committed
maths: add Kaprekar number implementation
1 parent 791deb4 commit 8cd61c3

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"""
2+
== Kaprekar Number ==
3+
A number n is a Kaprekar number if its square can be split into two parts
4+
(left and right) that add up to n, where the right part is non-zero.
5+
6+
Examples: 1, 9, 45, 55, 99, 297, 703, 999, 2223, 4950, 5050, 7272, 9999
7+
Reference: https://en.wikipedia.org/wiki/Kaprekar_number
8+
"""
9+
10+
11+
def is_kaprekar(number: int) -> bool:
12+
"""
13+
Returns True if number is a Kaprekar number, False otherwise.
14+
15+
>>> is_kaprekar(1)
16+
True
17+
>>> is_kaprekar(9)
18+
True
19+
>>> is_kaprekar(45)
20+
True
21+
>>> is_kaprekar(55)
22+
True
23+
>>> is_kaprekar(10)
24+
False
25+
>>> is_kaprekar(0)
26+
False
27+
>>> is_kaprekar(-1)
28+
False
29+
>>> is_kaprekar(2223)
30+
True
31+
>>> is_kaprekar(1.5)
32+
Traceback (most recent call last):
33+
...
34+
TypeError: Input value of [number=1.5] must be an integer
35+
"""
36+
if not isinstance(number, int):
37+
msg = f"Input value of [number={number}] must be an integer"
38+
raise TypeError(msg)
39+
if number < 1:
40+
return False
41+
if number == 1:
42+
return True
43+
square = number**2
44+
digits = len(str(square))
45+
for split in range(1, digits):
46+
right = square % (10**split)
47+
left = square // (10**split)
48+
if right > 0 and left + right == number:
49+
return True
50+
return False
51+
52+
53+
if __name__ == "__main__":
54+
import doctest
55+
56+
doctest.testmod()

0 commit comments

Comments
 (0)