HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaMinor

Finding happy numbers

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
happynumbersfinding

Problem

This is a practice question:


A happy number is a number defined by the following process:


Starting with any positive integer, replace the number by the sum of
the squares of its digits, and repeat the process until the number
equals 1 (where it will stay), or it loops endlessly in a cycle which
does not include 1. Those numbers for which this process ends in 1 are
happy numbers.

Example: 19 is a happy number

\$1^2 + 9^2 = 82\$

\$8^2 + 2^2 = 68\$

\$6^2 + 8^2 = 100\$

\$1^2 + 0^2 + 0^2 = 1\$

Program below solves this problem:

public static boolean isHappy(int n) {
   int sum=0;
   Set seenSet = new HashSet();
    while (n > 0) {
        int x = n%10;
        sum+=x*x;
        n=n/10;

        if (n == 0 && sum != 1) {
            n=sum;
            sum=0;
            seenSet.add(n);
        } else if (n== 0 && sum == 1 ) {
            return true;
        }
            else if (seenSet.contains(n)) {
            return false;
        }
    }

    return true;
}


I'm looking for any comments on how to improve the code, but a specific focus on whether the way the method returns from multiple places would be appreciated - the multiple return statements concern me.

Solution

The repeated n == 0 conditions are not pretty. It would be better to turn that part into a nested condition to avoid the duplication. It will also help simplifying the two conditions on sum.

In addition, there is one more comparison with 0 of n: in the loop condition. That's unnecessary, because n will never become 0. Only if the input is 0, but then the current implementation will return true, which is wrong, since 0 is not a happy number. As such, the loop can be while (true) infinite loop, and your could replace the last return statement with throw new IllegalStateException("whaaaat? How did you get here? ") or similar.

The overall logic would be easier to follow if you separate the summing of the digits from the method exit control. You could add a helper function that returns the sum of the squares of digits. Based on that result you could decide to return a value or continue for another round.

You can replace n=n/10 with n /= 10.

The formatting is messy too. Try the auto reformat feature of your favorite IDE.

Context

StackExchange Code Review Q#104668, answer score: 6

Revisions (0)

No revisions yet.