`
evget
  • 浏览: 144704 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类

完全数的java算法

阅读更多
文章关键字:|完全数|java|算法|完美数|因子|欧几里德|

什么是完全数?
如果一个正整数恰好等于它所有的真因子(即除了自身以外的因子)之和,则称之为完全数(完美数)。
例:6=1+2+3

欧几里德完全数定理:若p、(2的p次幂-1) 这两个值均为素数,则 2的(p-1)次幂 乘以 (2的p次幂-1) 的值是个完全数。
package yzg.arithmetic;

/**
* 欧几里德完全数定理:若p、(2的p次幂-1) 这两个值均为素数,则 2的(p-1)次幂 乘以 (2的p次幂-1) 的值是个完全数。
* 如果一个正整数恰好等于它所有的真因子(即除了自身以外的因子)之和,则称之为完全数(完美数)。 例:6=1+2+3
*
* @author yzg
*
*/
public class EntiretyNumber {

    /**
     * @param args
     */
    public static void main(String[] args) {
        for (long p = 2; p <= 31; p++) {
            if (!pri(p)) {
                continue;
            }
            long t = 2;
            for (int k = 1; k < p; k++) {
                t = t * 2;
            }

            long j = t / 2;
            t--;
            if (pri(t)) {
                System.out.println(j + " * " + t + " = " + (j * t));
            }
        }
        normal();
    }

    // 八个完全数
    // 3 * 2 = 6
    // 7 * 4 = 28
    // 31 * 16 = 496
    // 127 * 64 = 8128
    // 8191 * 4096 = 33550336
    // 131071 * 65536 = 8589869056
    // 524287 * 262144 = 137438691328
    // 2147483647 * 1073741824 = 2305843008139952128

    /**
     * 判断传入的参数是否是一个素数
     *
     * @param suShu
     * @return true=是,false=不是
     */
    public static boolean pri(long suShu) {
        int q = (int) Math.sqrt(suShu) + 1;
        for (int i = 2; i <= q; i++) {
            if (suShu % i == 0 && suShu != 2) {
                return false;
            }
        }
        return true;
    }

    /**
     * 求10000以内的完全数,普通的算法。
     * 找到后,显示成和的形式。
     */
    public static void normal() {
        for (int i = 6; i < 10000; i++) {
            int s = 0;
            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0) {
                    s += j;
                }
            }

            if (s == i) {
                System.out.print(s + " = 1");
                for (int j = 2; j <= i / 2; j++) {
                    if (i % j == 0) {
                        System.out.print(" + " + j);
                    }
                }
                System.out.println();
            }
        }
    }
}

原文地址:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9194
分享到:
评论

相关推荐

    Java计算平方数 Java算法实例.rar

    Java算法实例,计算一个数的平方数 Java,一个整数,加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少? 解题思路大致是:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方...

    [Java算法设计]-完全平方数.java

    文档还包括了高级主题,如如何优化算法以计算完全平方数和如何将完全平方数集成到更大的系统中。文档包含了详细的代码示例和实现细节,适合初学者和有经验的Java程序员,他们想提高在完全平方数方面的技能。 我们...

    Java算法集锦,所有排序算法

    "Java算法集锦"这个资源集合了多种排序算法的实现,旨在帮助开发者深入理解和运用这些经典算法。下面将详细介绍其中的一些关键算法及其特点。 1. **冒泡排序**(Bubble Sort):冒泡排序是最基础的排序算法之一,...

    求出1到1000的所有完全数.java

    利用Java编写程序,求出1到1000的所有完全数,完全数是其所有因子(包括1但不包括本身)的和等于该数 ,例如,28=1+2+4+7+14,28就是一个完全数

    java算法题(30个)

    Java算法题涵盖了许多基础到进阶的编程概念,主要集中在数据结构、算法设计以及逻辑推理上。以下是对这些题目涉及的知识点的详细说明: 1. **兔子问题**(斐波那契数列): - 知识点:斐波那契数列,递归算法。 -...

    java一亿数字取前100个(3秒钟获取)Java算法.zip

    标题中的“java一亿数字取前100个(3秒钟获取)Java算法”涉及到一个经典的计算机科学问题,即在海量数据中快速找到最大的前N个元素。这个问题在大数据处理、排序以及性能优化等领域有着广泛的应用。在这个场景下,...

    java算法大全源码包.zip

    Java实现如下算法: 1.链表 链表用来存储数据,由一系列的结点组成。这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表...

    JAVA绝对经典算法

    这个算法采用了一个简单的策略:从最小的质数2开始,尝试除尽目标数,直到不能再整除为止,然后继续下一个可能的质数,直至目标数完全被分解。这种方法虽然简单,但在处理大数时可能需要更复杂的优化策略。 以上四...

    java数百种算法实现

    以下是一些可能包含在"java算法大全源码包"中的关键算法类别及其简要介绍: 1. 排序算法: - 冒泡排序:基础排序算法,通过不断交换相邻的不正确顺序元素进行排序。 - 选择排序:每次找到未排序部分的最小元素并...

    java遗传算法寻找最优路径

    ### Java遗传算法寻找最优路径 #### 一、遗传算法概览 遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传学原理的全局优化技术。它通过模拟自然界中的生物进化过程来解决优化问题,包括搜索空间较大的...

    java算法练习试题

    【程序 13】寻找满足特定条件的整数,需要遍历一定范围内的数字,检查它们加上特定值后是否为完全平方数。可以通过计算平方根并判断其整数部分是否准确来验证。 【程序 14】判断日期是当年的第几天需要考虑到闰年的...

    Java面试经典算法

    13. 完全平方数问题:该题目考查了算法设计和实现能力。一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? 14. 日期问题:该题目考查了算法设计和实现能力。输入某年某月...

    java算法练习题 初学者

    【Java算法练习题初学者】 对于Java初学者来说,掌握基础的算法是非常重要的,这有助于提升编程思维和问题解决能力。下面将详细讲解几个经典的Java算法练习题。 1. **兔子问题**(斐波那契数列): 这是一个经典...

    java经典算法最常用算法42例

    根据提供的文件信息,我们可以总结出以下五个Java编程中的经典算法示例及其实现方式: ### 1. 斐波那契数列 **标题描述**:斐波那契数列是一个经典的数学序列,其中每个数字是前两个数字的和。 **代码实现**: ``...

    经典java分页算法

    总页数 `totalpagenum` 可以通过 `totalsize` 除以 `countperpage` 计算得出,但是需要注意的是,如果总记录数与每页记录数相除有余数,那么总页数需要加上1,因为存在不能完全填充一页的记录。 代码示例: ```...

    (完整版)JAVA经典算法40题.doc

    这四个程序展示了Java编程中的基础算法和数据结构应用,包括递归、循环、条件判断以及数学运算等核心概念。学习和理解这些算法有助于提升编程能力,解决实际问题。在实际的软件开发中,类似的问题可能会出现在数据...

    javva 算法 java算法大全源码包

    Java算法是编程领域中的核心部分,它涉及到计算机科学的基础理论和高效解决问题的技巧。这个"Java算法大全源码包"提供了多种经典的算法实现,对于学习和理解算法有着极高的价值。下面将对这些算法进行详细介绍。 1....

    实战应用Java算法分析与设计(链表、二叉树、哈夫曼树、图、动态规划)视频

    ### 实战应用Java算法分析与设计 #### 一、引言 在计算机科学领域,算法是解决问题的关键。《实战应用Java算法分析与设计》视频教程深入浅出地讲解了链表、二叉树、哈夫曼树、图以及动态规划等核心数据结构与算法,...

    求小于5000中的完全数

    在探讨“求小于5000中的完全数”的过程中,我们不仅将深入理解完全数的概念,还将解析一种基于Java编程语言的求解算法。通过分析给出的代码片段,我们可以了解到如何利用for循环来查找一定范围内的完全数,这对于...

    java算法大全源码包

    Java算法大全源码包是一个非常宝贵的资源,适合Java开发者深入理解和掌握各种算法。这个源码包包含了一系列经典的算法实现,是提升编程技能和解决问题能力的理想工具。以下将详细阐述其中可能涉及的一些重要算法及其...

Global site tag (gtag.js) - Google Analytics