alex1234567890987
alex1234567890987

Reputation: 3

Don't understand why code for digit sum isn't working

I tried to do the codewars Sum of Digits/Digital Root problem, where you have to:

Given n, take the sum of the digits of n. If that value has more than one digit, continue reducing in this way until a single-digit number is produced. The input will be a non-negative integer.

So passing through 52 would return 7, as 5 + 2 is 7 and passing through 942 would return 6, as 9 + 4 + 2 = 15 and then 1 + 5 = 6.

I came up with this code:

def digital_root(n):
    n_str = str(n)
    digit_total = 0
    while len(n_str) != 1:
        for digit in n_str:
            digit_total += int(digit)
        n_str = str(digit_total)
    return(n_str)

But it only works for 2 digit numbers and it won't work for higher digit numbers, it just endlessly runs. This code is probably a bad way to do it and I've looked over other people's answers and I get their solution but I just don't get why this won't work for higher digit numbers.

Upvotes: 0

Views: 377

Answers (2)

Joe Ferndz
Joe Ferndz

Reputation: 8508

You have got your program almost right. The only challenge I see is with resetting the variable digit_total = 0 after each iteration.

def digital_root(n):
    n_str = str(n)
    while len(n_str) != 1:
        digit_total = 0 #move this inside the while loop
        for digit in n_str:
            digit_total += int(digit)
        n_str = str(digit_total)
    return(n_str)

print (digital_root(23485))

The output for print (digital_root(23485)) is 4

2 + 3 + 4 + 8 + 5 = 22
2 + 2 = 4

If the digit_total = 0 is not inside the while loop, then it keeps getting added and you get a never ending loop.

While you have a lot of code, you can do this in a single line.

def sum_digits(n):
    while len(str(n)) > 1: n = sum(int(i) for i in str(n))
    return n

print (sum_digits(23485))

You don't need to create too many variables and get lost in keeping track of them.

Upvotes: 3

NabMe
NabMe

Reputation: 36

Alex, running a recursive function would always be better than a while loop in such scenarios.

Try this :

def digital_root(n):
    n=sum([int(i) for i in str(n)])

    if len(str(n))==1:
        print(n)     
    else:
        digital_root(n)

Upvotes: 0

Related Questions