Java编程题目-7:快乐数

前天看一个人的笔试经验提到了编程题目:快乐数。快乐数是什么?快乐数(happy number)有以下的特性:在给定的进位制下,该数字所有数位(digits)的平方和,得到的新数再次求所有数位的平方和,如此重复进行,最终结果必为1。
详情请查阅百度百科中快乐数的定义。
我们使用十进制来进行一般理解:就是一个十进制的数字,将其每一位的数字取出进行平方和的累加,得到的新数字重复该操作,直至得到的平方和为1,那么该数字为快乐数。
接下来进行代码实现,我采用十进制数字演示:

public class HappyNum {
    public static void main(String[] args) {
        int res = isHappyNum(100);
        System.out.println(res);
    }

    public static int isHappyNum(int num){
        int res = 0;// 最终的返回值
        if (num / 100 > 9 || num == 0) {
            System.out.println("参数必须是十进制三位数!");
            return res;
        }
        int unitsDigit = num %100%10;// 个位数
        int tensDigit= num%100/10;// 十位数
        int hundredsDigit = num/100;// 百位数
        int sum = unitsDigit*unitsDigit+tensDigit*tensDigit+hundredsDigit*hundredsDigit;

        if(sum == 1){
            res = 1;// 确认是快乐数,返回1
        }else if(sum ==4){
            res = -1;// 确认是非快乐数,返回-1
        }else{
            return isHappyNum(sum);// 未得到确切结果,进行递归处理。*
        }
        return res;
    }
}

junit测试代码:

public class HappyNumTest {
    @Test
    public void testIsHappyNum() {
        int res1 = HappyNum.isHappyNum(7);
        int res2 = HappyNum.isHappyNum(32);
        int res3 = HappyNum.isHappyNum(97);
        int res4 = HappyNum.isHappyNum(100);
        int res5 = HappyNum.isHappyNum(0);
        int res6  = HappyNum.isHappyNum(1000);

        assertEquals(1, res1);
        assertEquals(1, res2);
        assertEquals(1, res3);
        assertEquals(1, res4);
        assertEquals(0, res5);
        assertEquals(0, res6);
    }
}

测试结果:
这里写图片描述

总结:

关于快乐数的代码,关键是取出数字每位上的数,进行计算后进行分支判断,以及方法的递归调用。

代码当中标注“*”星号的位置如果不加return的话就不能正确的返回结果,必须要加上return,这个问题我暂时还没想出原因。

猜你喜欢

转载自blog.csdn.net/u011314731/article/details/52518131