How Many Times to Kaprekar’s Constant Using Python


Introduction

6174 is known as Kaprekar’s constant after the Indian mathematician D. R. Kaprekar. This number is notable for the following rule:

  1. Take any four-digit number, using at least two different digits (leading zeros are allowed).
  2. Arrange the digits in descending and then in ascending order to get two four-digit numbers, adding leading zeros if necessary.
  3. Subtract the smaller number from the bigger number.
  4. Go back to step 2 and repeat.

The above process, known as Kaprekar’s routine, will always reach its fixed point, 6174, in at most 7 iterations. Once 6174 is reached, the process will continue yielding 7641 – 1467 = 6174. For example, choose 3524:5432 – 2345 = 30878730 – 0378 = 83528532 – 2358 = 61747641 – 1467 = 6174

The only four-digit numbers for which Kaprekar’s routine does not reach 6174 are repdigits such as 1111, which give the result 0000 after a single iteration. All other four-digit numbers eventually reach 6174 if leading zeros are used to keep the number of digits at 4.

Finding the number of times using Python

To learn how to sort an integer in python, check out this tutorial on how to sort an integer.

# Taken from http://ataiva.com/how-to-sort-an-integer-in-python
def sort_asc(n):
  return int("".join(sorted([i for i in str(n)])))

# Taken from http://ataiva.com/how-to-sort-an-integer-in-python
def sort_desc(n):
  return int("".join(sorted([i for i in str(n)], reverse=True)))


def kaprekar_times(n):
  # count how many times
  count = 0

  # set the last answer to compare against
  last = n

  # loop forever
  while True:
    # get the smallest and biggest
    smaller = sort_asc(last)
    bigger = sort_desc(last)

    # get the answer
    answer = bigger-smaller
    # increment
    count += 1

    # return the count if it's a match
    if answer==last:
      return count
    else:
      # otherwise continue
      last = answer

  # return if all else fails
  return count

# Some test cases
print(kaprekar_times(9272)) # 6
print(kaprekar_times(1263)) # 8
print(kaprekar_times(9820)) # 8
print(kaprekar_times(2489)) # 4