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

九路 等级 765 0 0
标签: 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 先实现求一个数的各个位的平方和,代码如下:

   public static int sqrt(int n){
        if(n < 10){
            return n * n;
        }

        int sum = 0;
        while ( n >= 10){       //如果 n 是两位数
            int t = n % 10;     //求低位数
            sum += t * t;       //把低位数的平方累加到sum中

            n = n / 10;         // n 去掉低位数
        }

        sum += n * n;           // n 为1 位数时不满足上面的条件,但这时候需要把它累加到sum中

        return sum;
    }

再看 isHappyNumber()方法

    public static boolean isHappyNumber(int number){

        //下面几条都是递归的退出条件
        if(number <= 0 ){
            return false;
        }

        if(number == 1){
            return true;
        }

        //4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4
        if(number == 4 || number == 16 || number == 37 || number == 58
            || number == 89 || number == 145 || number == 42 || number == 20){
            return false;
        }

        int result = sqrt(number);
        if(result == 1){
            return true;
        }

        return isHappyNumber(result);
    }

测试

System.out.println(isHappyNumber(28));
输出 true
收藏
评论区

相关推荐

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
JAVA NIO(一)
**1 NIO概述** 1.1NIO(new IO)是一个可以替代java IO API的API,NIO提供了与标准IO不同的工作方式,标准IO是基于字节流和字符流进行操作的,而NIO是基于channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写到通道中,方式如例图示,JAVA NIO的几个核心组成部分是channels,Buf
JAVA工程师成神道路
一、基础篇 ----- ### 1.1 JVM #### 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 > http://www.jcp.org/en/jsr/detail?id=133 > http://ifeve.com/jmm-faq/ #### 1.1.2. 了解JVM各种参数及调优 #### 1.1.3.
JDBC详细说明+使用
[JDBC详解](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2Ferbing%2Fp%2F5805727.html) **一、相关概念** 1.什么是JDBC   JDBC(Java Data Base Connectivity,java数据库连接
Java8实战
第 1 章 为什么要关心 Java 8 1.1 Java 怎么还在变   1.1.1 Java 在编程语言生态系统中的位置   1.1.2 流处理      流是一系列数据项,一次只生成一项   1.1.3 用行为参数化把代码传递给方法   1.1.4 并行与共享的可变数据   1.1.5 Java 需要演变 1.2 Java 中
Java可选参数
### 问题: _How do I use optional parameters in Java?_ **如何在Java中使用可选参数?** _What specification supports optional parameters?_ **什么规范支持可选参数?** * * * ### 解决方案: 参考一: [https://stackoo
Java工程师成神之路~
一、基础篇 ----- ### 1.1 JVM #### 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 > http://www.jcp.org/en/jsr/detail?id=133 > http://ifeve.com/jmm-faq/ #### 1.1.2. 了解JVM各种参数及调优 #### 1.1.3.
Java运行时数据区域
两个名词的对比 ------- * java内存模型 定义了线程和主内存之间的抽象关系,即Jvm在计算机内存中的工作方式,控制线程之间的通信。 * java内存区域 内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。 **今天主要总结一下Java运行时的数据区域** Java运行时数据区域 ----------- **
java04eclipse常见设置和java的第一个程序、命名规范、编码规范
一、java的第一个程序 \*所有的java程序是写在.java为后缀的文本 \*所有的java程序一定是写在class中   即写在类里面的 \*所有的java程序的入口一定是main方法 \*写代码 二、新建一个java项目 《1》新建一个java工程 《2》在src下建包 《3》在包下面新建java文件 《4》所有java代码是在写类
java入门
一) Java言语入门教程Java类的组成一向很喜欢一句广告词:日子即是一个七天又一个七天。而我想说的是,Java运用就是一个类又一个类。Java是面向目标的言语,目标都是由类实例化而来。一个Java运用,不管简略仍是杂乱,都是由若干个Java类组成的。因而,关于初学者,先知道Java类的组成是必要的。 Java类的组成首要有3有些:数据成员、结构办法、办
java基础
### JAVA 集合 在处理数据的过程中经常会需要一个容器来存储某一类型的数据,Java 中的数组就是这样一种容器。但 Java 中的数组有其局限性,定义后的数组长度不可变,超出数组长度后就不能再存放数据了。而很多时候我们并不知道数据到底有多少,所以就需要有不定长的容器来存放数据,这就是集合,Java 中的集合都采用了泛型实现,可以存入任何类型的对象数据
java数据库
1.jdbc   JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用[Java语言](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fbaike.baidu.com%2
java的特性
java的特性 ======= 1、Java语言是简单的 2、Java语言是面向对象的 3、Java语言是分布式的 4、Java语言是健壮的 5、Java语言是安全的 6、Java语言是可移植性的 7、Java语言是解释型的 8、Java语言是多线程的 9、Java语言是动态的语言   **Java语言是简单的:**  
java(十一)数组
数组用来存放相同数据类型的数据,逻辑位置与物理位置都是连续的。 数组存放在堆里。 栈和堆: 栈:方法调用的时候使用栈,局部变量存放在栈里。 堆:动态的分配内存,new出来的。引用类型存放在堆里,在栈里存放引用,也就是地址,一般用16进制来表示地址:0x...。 基本类型和引用类型的区别: 基本类型:在栈中存放的是二进制位。 引用
Gson的学习与使用
Gson介绍: ======= GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。 特点: a、快速、高效 b、代码量少、简洁 c、面向对象 d、数据传递和解析方便 Gson的pom依赖: <d