文档章节

完美数 Perfect Number

叶枫啦啦
 叶枫啦啦
发布于 2017/06/27 15:34
字数 465
阅读 8
收藏 0

问题:

We define the Perfect Number is a positive integer that is equal to the sum of all its positive divisors except itself.

Now, given an integer n, write a function that returns true when it is a perfect number and false when it is not.

Example:

Input: 28
Output: True
Explanation: 28 = 1 + 2 + 4 + 7 + 14

Note: The input number n will not exceed 100,000,000. (1e8)

解决:

① 第一种思路是暴力解决,但是超时了。

public class Solution {
    public boolean checkPerfectNumber(int num) {
        if(num <= 0) return false;
        int sum = 0;
        for (int i = 1;i < num ;i ++ ) {
            if (num % i == 0) {
                sum += i;
            }
        }
        if (num == sum) {
            return true;
        }else{
            return false;
        }
    }
}

② 根据上一个解法,我们考虑2-sqrt(nums)范围内的数,之后的就是nums/之前的数。要注意的是要考虑到i!=num / i的情况。

public class Solution { //14ms
    public boolean checkPerfectNumber(int num) {
        if (num == 1) return false;
        int sum = 0;
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) {
                sum += i;
                if (i != num / i) sum += num / i;
            }
        }
        sum ++;
        return sum == num;
    }
}

进阶版****:

public class Solution { //14ms
    public boolean checkPerfectNumber(int num) {
        if (num == 1) return false;
        int sum = 0;
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) {
                sum += i + num / i;
            }
        }
        sum ++;
        return sum == num;
    }
}

每个完美数都可以写成从1开始的几个自然数之和,如:
6 = 1 + 2 + 3
28 = 1 + 2 + 3 + 4 + 5 + 6 + 7
我么可以看出,最后一个加数是最大的不能被2整除的因子n。由求和公式可以得到最终的和:                   sum = n *(n + 1)/ 2

public class Solution { //10ms
    public boolean checkPerfectNumber(int num) {       
        if(num <= 1) {
            return false;
        }        
        int sum = 0;
        int n = num;
        while(n % 2 == 0) { //可以被2整除
            n /= 2;
        }
        sum = n * (n + 1) / 2;
        return sum == num;
    }
}

④ sum = 1 + 2 + ...... + 最大的不能被2整除的因子。

public class Solution { //11ms
    public boolean checkPerfectNumber(int num) {
       if(num == 0 || num == 1) return false;
        int sum = 1;
        int n = 2;
        while(num % n == 0){
            sum += n;
            sum += num / n;
            n = 2 * n;          
        }

        return sum == num ? true : false;
    }
}

© 著作权归作者所有

共有 人打赏支持
叶枫啦啦
粉丝 12
博文 569
码字总数 354997
作品 0
海淀
私信 提问
LeetCode 279. Perfect Squares (完美平方数)

原题 Given a positive integer n, find the least number of perfect square numbers (for example, ) which sum to n. Example 1: Example 2: Reference Answer 思路分析 这道题是考察四平......

dby_freedom
12/05
0
0
树&二叉树&&满二叉树&&完全二叉树&&完满二叉树

目录 树 二叉树 树 名称 作用 根 树的顶端结点 孩子 当远离根(Root)的时候,直接连接到另外一个结点的结点被称之为孩子(Child); 双亲 相应地,另外一个结点称为孩子(child)的双亲(parent); 兄...

Chicago_01
08/27
0
0
perfect shuffle 算法的一个线性复杂度实现

今天又发现一个关于完美洗牌的算法。这个比较简单一些,由 microsoft的Peiyush Jain提出。 原论文: A Simple In-Place Algorithm for In-Shuffle. Peiyush Jain, Microsoft Corporation. J...

吟啸_徐行
2014/03/20
0
2
常用哈希(散列)函数集合 - NHF(Normal Hash Function)

从加密的角度讲,一个良好的的哈希函数f应当满足以下三个条件: 任意y,找x,使得f(x)=y,非常困难 给定x1,找x2,使得f(x1)=f(x2),非常困难 找x1,x2,使得f(x1)=f(x2),非常困难 从检索访...

开源中国驻成都办事处
2012/09/13
0
0
简约强大的自定义滚动条插件--Perfect Scrollbar

Perfect Scrollbar 简约,但完美的自定义滚动条插件。 完美意味着什么? 无需对默认元素有任何更改 滚动条不应影响默认设计布局 滚动条的设计应(几乎)完全可定制 若容器或内容大小发生变化...

匿名
2017/08/29
200
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
5
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
20
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部