前天看一个人的笔试经验提到了编程题目:快乐数。快乐数是什么?快乐数(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);
}
}
测试结果:
总结:
关于快乐数的代码,关键是取出数字每位上的数,进行计算后进行分支判断,以及方法的递归调用。