Skip to content

How to Determine if a Number Is a Harshad Number in Python

Learn how to check if a number is a Harshad (Niven) number in Python using string conversion for readability or integer arithmetic for performance, with practical examples and code snippets.

A Harshad number (or Niven number) is a positive integer that is divisible by the sum of its digits. For example, 12 is a Harshad number because 1 + 2 = 3, and 12 is perfectly divisible by 3. These numbers are useful in recreational mathematics and digital root calculations.

This guide explains two methods to check for Harshad numbers in Python: using string conversion for readability and using integer arithmetic for performance optimization.

Understanding the Logic

To verify if a number n is a Harshad number:

  1. Calculate Sum of Digits: Add every individual digit of n.
  2. Check Divisibility: If n \% \text{sum} == 0, it is a Harshad number.
  3. Constraint: Harshad numbers must be positive integers (n > 0).

Method 1: String Conversion (Readable)

The most intuitive way to sum the digits of a number in Python is to convert it to a string, iterate over the characters, convert them back to integers, and sum them.

def is_harshad_string(n):
    if n <= 0:
        return False

    digits = [int(d) for d in str(n)]
    digit_sum = sum(digits)

    return n % digit_sum == 0

print(f"Is 12 Harshad? {is_harshad_string(12)}")  # True (1+2=3, 12%3==0)
print(f"Is 19 Harshad? {is_harshad_string(19)}")  # False (1+9=10, 19%10!=0)

Output:

Is 12 Harshad? True
Is 19 Harshad? False

Method 2: Integer Arithmetic (Optimized)

Converting numbers to strings can be slow for very large numbers or in performance-critical applications. We can extract digits mathematically using the modulo operator % and integer division //.

def is_harshad_math(n):
    if n <= 0:
        return False

    original_n = n
    digit_sum = 0

    while n > 0:
        digit_sum += n % 10  # Get last digit
        n //= 10             # Remove last digit

    return original_n % digit_sum == 0

print(f"Is 21 Harshad? {is_harshad_math(21)}")      # True (2+1=3, 21%3==0)
print(f"Is 200 Harshad? {is_harshad_math(200)}")    # True (2+0+0=2, 200%2==0)

Output:

Is 21 Harshad? True
Is 200 Harshad? True

Practical Application: Harshad Sequences

Harshad numbers often appear in sequences. Let's create a generator to find the first N Harshad numbers.

def is_harshad_math(n):
    if n <= 0:
        return False

    original_n = n
    digit_sum = 0

    while n > 0:
        digit_sum += n % 10  # Get last digit
        n //= 10             # Remove last digit

    return original_n % digit_sum == 0

def generate_harshad_numbers(limit):
    count = 0
    num = 1
    result = []
    
    while count < limit:
        if is_harshad_math(num):
            result.append(num)
            count += 1
        num += 1
        
    return result

sequence = generate_harshad_numbers(10)
print(f"First 10 Harshad Numbers: {sequence}")

Output:

First 10 Harshad Numbers: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Conclusion

To check for Harshad numbers in Python:

  1. Use String Conversion (sum(int(d) for d in str(n))) for simplicity and readability.
  2. Use Integer Arithmetic (while n > 0) for performance efficiency.
  3. Validate Inputs to ensure n > 0, as division by zero or negative number logic can cause errors.
Navigation