카프리카 수(Kaprekar Number)는 독특한 성질을 지닌 양의 정수입니다. 수정된 카프리카 수(modified Kaprekar number)란 d자리 양의 정수 n 가운데, 제곱한 결과를 두 부분으로 나누었을 때 오른쪽 조각 r(d자리)과 왼쪽 조각 l(남은 d 또는 d−1자리)의 합이 원래 수와 같아지는 수를 말합니다(즉, l + r = n).
가장 대표적인 예는 45입니다. 45의 제곱인 2025를 20과 25로 나누면 20 + 25 = 45가 되므로 45는 카프리카 수에 해당합니다.
주어진 범위 내에서 카프리카 수 찾기
범위 안의 모든 수를 하나씩 검사하면서 위 조건을 만족하는지 확인하면 해당 구간의 카프리카 수를 모두 찾을 수 있습니다. 구체적인 절차는 다음과 같습니다.
- 숫자를 제곱한 뒤 문자열로 변환합니다.
- 문자열을 가능한 모든 위치에서 왼쪽 조각과 오른쪽 조각으로 나눕니다.
- 두 조각을 정수로 변환해 더한 값이 원래 수와 같은지 비교합니다.
- 조건이 성립하면 해당 숫자를 카프리카 수로 출력합니다.
오른쪽 조각 앞에 0이 붙는 경우에도 int() 함수가 자동으로 처리하므로 계산에는 문제가 없습니다.
예제 코드
def print_Kaprekar_nums(start, end):
for i in range(start, end + 1):
# 제곱한 값의 자릿수를 문자열로 저장
sqr = i ** 2
digits = str(sqr)
# 1부터 (자릿수 길이 - 1)까지 반복하며 좌우 조각을 더해 확인
length = len(digits)
for x in range(1, length):
left = int("".join(digits[:x]))
right = int("".join(digits[x:]))
if (left + right) == i:
print("Number:", i, "| Left:", left, "| Right:", right)
print_Kaprekar_nums(150, 8000)
실행 결과
위 코드를 150부터 8000까지의 범위에서 실행하면 다음과 같은 결과가 출력됩니다.
Number: 297 | Left: 88 | Right: 209
Number: 703 | Left: 494 | Right: 209
Number: 999 | Left: 998 | Right: 1
Number: 1000 | Left: 1000 | Right: 0
Number: 2223 | Left: 494 | Right: 1729
Number: 2728 | Left: 744 | Right: 1984
Number: 4879 | Left: 238 | Right: 4641
Number: 4950 | Left: 2450 | Right: 2500
Number: 5050 | Left: 2550 | Right: 2500
Number: 5292 | Left: 28 | Right: 5264
Number: 7272 | Left: 5288 | Right: 1984
Number: 7777 | Left: 6048 | Right: 1729
결과 해석
예를 들어 297의 경우 297² = 88209이며, 이를 88과 209로 나누면 88 + 209 = 297이 되어 조건을 충족합니다. 마찬가지로 703² = 494209이므로 494 + 209 = 703 역시 성립합니다.
반면 999(998 + 1)나 1000(1000 + 0)처럼 한쪽 조각이 극단적으로 작거나 0이 되는 경계 사례도 함께 출력됩니다. 적용하는 정의에 따라 이러한 사례를 포함할지 제외할지는 구현 단계에서 결정하면 됩니다.