Java判断一个数是不是快乐数

快乐数的定义: 快乐数(happy number)有以下的特性: 在给定的进位制下,该数字所有数位(digits)的平方和,得到的新数再次求所有数位的平方和,如此重复进行,最终结果必为1。

以十进制为例: 2 8 → 2²+8²=68 → 6²+8²=100 → 1²+0²+0²=1 3 2 → 3²+2²=13 → 1²+3²=10 → 1²+0²=1 3 7 → 3²+7²=58 → 5²+8²=89 → 8²+9²=145 → 1²+4²+5²=42 → 4²+2²=20 → 2²+0²=4 → 4²=16 → 1²+6²=37……

因此28和32是快乐数,而在37的计算过程中,37重覆出现,继续计算的结果只会是上述数字的循环,不会出现1,因此37不是快乐数。 不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。

很明显,这可以用递归思想来求解 如果一个数是1,就是快乐数,如果不是1,就判断这个数是不是 4,16,37... 等等上面出现的那个循环中数,如果是就返回false,否则就继承递归判断。

1 先实现求一个数的各个位的平方和,代码如下:

1 public static int sqrt(int n){ 2 if(n < 10){ 3 return n * n; 4 } 5 6 int sum = 0; 7 while ( n >= 10){ //如果 n 是两位数 8 int t = n % 10; //求低位数 9 sum += t * t; //把低位数的平方累加到sum中 10 11 n = n / 10; // n 去掉低位数 12 } 13 14 sum += n * n; // n 为1 位数时不满足上面的条件,但这时候需要把它累加到sum中 15 16 return sum; 17 } 18

再看 isHappyNumber()方法

1 public static boolean isHappyNumber(int number){ 2 3 //下面几条都是递归的退出条件 4 if(number <= 0 ){ 5 return false; 6 } 7 8 if(number == 1){ 9 return true; 10 } 11 12 //4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 13 if(number == 4 || number == 16 || number == 37 || number == 58 14 || number == 89 || number == 145 || number == 42 || number == 20){ 15 return false; 16 } 17 18 int result = sqrt(number); 19 if(result == 1){ 20 return true; 21 } 22 23 return isHappyNumber(result); 24 }

测试

1System.out.println(isHappyNumber(28)); 2输出 true
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

mysql中like用法

like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\

20180109Java位运算

一,Java位运算1.表示方法:  在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1。补码的表示需要满足如下要求。 (1)正数的最高位为0,其余各位代表数值本身(二进制数)。 (2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1。 2.位运算符位运算表达式由