文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java语言如何求解完美数

2023-05-30 19:16

关注

这篇文章主要介绍了Java语言如何求解完美数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1、概念

首先我们理解一下,什么叫做完美数?

问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数。简称“完数”

例如,

  6=1+2+3
  28=1+2+4+7+14
  496=1+2+4+8+16+31+62+124+248
  8128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064

按照完数的定义,其实用程序求解完数并不是太难,先求解出这个数的所有真因子,然后相加,判断是否等于它本身即可。但是,在这个数很小的时候,没有什么问题,一旦这个数字超过一定的数值,那么问题就来了,程序的执行效率就会变得低下。

我们优化程序的算法逻辑,往往会考虑一个问题,怎么高效的利用计算机的特性?在它所定义的算法中,有没有大量重复的无用功呢?沿着这样的思路去考虑这个问题,我们会很快得到另外的一种解决方案。

2、说明

2.1分析

在这里,我们会不会很容易就想到,之前我们提到过的分解因式?是的,在解决完美数的时候,我们会用到分解因式。一般来说,求解完美数会经过三个步骤:

求出一定数目的质数表

利用质数表求指定数的因式分解

利用因式分解求所有真因数和,并检查是否为完美数

2.2难点

初看之下,第一步和第二步是没什么问题的,我们在前面的两篇文章中已经探讨过了,不清楚的同学可以查看。

重点是在第三步,如何求真因数和?方法很简单,要先知道将所有真因数(有不清楚真因数概念的同学,去看看)和加上该数本身,会等于该数的两倍(有些同学不知道,现在应该也知道了吧?),例如:

2 * 28 = 1 + 2 + 4 + 7 + 14 + 28

事实上,这段等式可以转换为:(代码输入错误,我用截图好了)

Java语言如何求解完美数

发现没有?2和7都是因式分解得到的,那么,程序是不是有了简化的地方?

2.3结论

只要求出因式分解,就可以利用循环求得等式后面的值,将该值除以2就是真因数和了;等式后面第一眼看时可能想到使用等比级数公式来解,不过会使用到次方运算,可以在进行读取因式分解阵列时,同时计算出等式后面的值。

3、代码

import java.util.ArrayList; // 求解完美数 public class PerfectNumber {   // 传入一个值,求解至少多少个完美数   public static int[] lessThan(int number) {     int[] primes = Prime.findPrimes(number);      ArrayList list = new ArrayList();          for(int i = 1; i <= number; i++) {        int[] factors = factor(primes, i);        if(i == fsum(factors))          list.add(new Integer(i));     }       int[] p = new int[list.size()];     Object[] objs = list.toArray();      for(int i = 0; i < p.length; i++) {       p[i] = ((Integer) objs[i]).intValue();     }          return p;   }      // 分解因式   private static int[] factor(int[] primes, int number) {      int[] frecord = new int[number];     int k = 0;          for(int i = 0; Math.pow(primes[i], 2) <= number;) {        if(number % primes[i] == 0) {          frecord[k] = primes[i];          k++;          number /= primes[i];        }        else          i++;      }       frecord[k] = number;       return frecord;    }     // 因式求和   private static int fsum(int[] farr) {      int i, r, s, q;       i = 0;      r = 1;      s = 1;      q = 1;       while(i < farr.length) {        do {          r *= farr[i];          q += r;          i++;        } while(i < farr.length - 1 &&           farr[i-1] == farr[i]);        s *= q;        r = 1;        q = 1;      }       return s / 2;    }      public static void main(String[] args) {     int[] pn = PerfectNumber.lessThan(1000);         for(int i = 0; i < pn.length; i++) {       System.out.print(pn[i] + " ");     }          System.out.println();   } }

感谢你能够认真阅读完这篇文章,希望小编分享的“Java语言如何求解完美数”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯