欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java語言求解完美數(shù)代碼分析

 更新時間:2017年12月01日 09:12:52   作者:ljtyzhr  
這篇文章主要介紹了Java語言求解完美數(shù)代碼分析,具有一定參考價值,需要的朋友可以了解下。

1、概念

首先我們理解一下,什么叫做完美數(shù)?

問題描述:若一個自然數(shù),它所有的真因子(即除了自身以外的約數(shù))的和恰好等于它本身,這種數(shù)叫做完全數(shù)。簡稱“完數(shù)”

例如,

  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

按照完數(shù)的定義,其實用程序求解完數(shù)并不是太難,先求解出這個數(shù)的所有真因子,然后相加,判斷是否等于它本身即可。但是,在這個數(shù)很小的時候,沒有什么問題,一旦這個數(shù)字超過一定的數(shù)值,那么問題就來了,程序的執(zhí)行效率就會變得低下。

我們優(yōu)化程序的算法邏輯,往往會考慮一個問題,怎么高效的利用計算機的特性?在它所定義的算法中,有沒有大量重復(fù)的無用功呢?沿著這樣的思路去考慮這個問題,我們會很快得到另外的一種解決方案。

2、說明

2.1分析

在這里,我們會不會很容易就想到,之前我們提到過的分解因式?是的,在解決完美數(shù)的時候,我們會用到分解因式。一般來說,求解完美數(shù)會經(jīng)過三個步驟:

1.求出一定數(shù)目的質(zhì)數(shù)表

2.利用質(zhì)數(shù)表求指定數(shù)的因式分解

3.利用因式分解求所有真因數(shù)和,并檢查是否為完美數(shù)

2.2難點

初看之下,第一步和第二步是沒什么問題的,我們在前面的兩篇文章中已經(jīng)探討過了,不清楚的同學(xué)可以查看。

重點是在第三步,如何求真因數(shù)和?方法很簡單,要先知道將所有真因數(shù)(有不清楚真因數(shù)概念的同學(xué),去看看)和加上該數(shù)本身,會等于該數(shù)的兩倍(有些同學(xué)不知道,現(xiàn)在應(yīng)該也知道了吧?),例如:

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

事實上,這段等式可以轉(zhuǎn)換為:(代碼輸入錯誤,我用截圖好了)

發(fā)現(xiàn)沒有?2和7都是因式分解得到的,那么,程序是不是有了簡化的地方?

2.3結(jié)論

只要求出因式分解,就可以利用循環(huán)求得等式后面的值,將該值除以2就是真因數(shù)和了;等式后面第一眼看時可能想到使用等比級數(shù)公式來解,不過會使用到次方運算,可以在進(jìn)行讀取因式分解陣列時,同時計算出等式后面的值。

3、代碼

import java.util.ArrayList; 
// 求解完美數(shù) 
public class PerfectNumber { 
  // 傳入一個值,求解至少多少個完美數(shù) 
  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(); 
  } 
} 

總結(jié)

以上就是本文關(guān)于Java語言求解完美數(shù)代碼分析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出!

相關(guān)文章

  • Java源碼解析之接口Collection

    Java源碼解析之接口Collection

    Collection是List、Queue和set的超集,它直接繼承于Iterable,也就是說所有的Collection集合類都支持foreach循環(huán).除此之外呢,Collection也是面向接口編程的典范,它可以在多種實現(xiàn)類間轉(zhuǎn)換,這就是面向?qū)ο缶幊痰膮柡χ?接下來就隨著小編一起去看看吧,需要的朋友可以參考下
    2021-05-05
  • Spring Cloud Data Flow初體驗以Local模式運行

    Spring Cloud Data Flow初體驗以Local模式運行

    這篇文章主要介紹了Spring Cloud Data Flow初體驗以Local模式運行,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用

    Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用

    Spring?Boot2.6.0為我們帶來很多好用的新特性/改進(jìn),這篇文章主要給大家介紹了關(guān)于Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • Java對象在JVM中的生命周期詳解

    Java對象在JVM中的生命周期詳解

    這篇文章主要介紹了Java對象在JVM中的生命周期詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 如何搭建一個完整的Java開發(fā)環(huán)境

    如何搭建一個完整的Java開發(fā)環(huán)境

    這篇文章主要教大家如何搭建一個完整的Java開發(fā)環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java IO流對象的序列化和反序列化實例詳解

    Java IO流對象的序列化和反序列化實例詳解

    這篇文章主要介紹了Java IO流對象的序列化和反序列化實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 使用maven編譯Java項目實例

    使用maven編譯Java項目實例

    這篇文章主要介紹了使用maven編譯Java項目實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • spring boot國際化之MessageSource的使用方法

    spring boot國際化之MessageSource的使用方法

    這篇文章主要給大家介紹了spring boot國際化之MessageSource使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring?Batch批處理框架操作指南

    Spring?Batch批處理框架操作指南

    Spring?Batch?是?Spring?提供的一個數(shù)據(jù)處理框架。企業(yè)域中的許多應(yīng)用程序需要批量處理才能在關(guān)鍵任務(wù)環(huán)境中執(zhí)行業(yè)務(wù)操作,這篇文章主要介紹了Spring?Batch批處理框架操作指南,需要的朋友可以參考下
    2022-07-07
  • Java如何基于command調(diào)用openssl生成私鑰證書

    Java如何基于command調(diào)用openssl生成私鑰證書

    這篇文章主要介紹了Java如何基于command調(diào)用openssl生成私鑰證書,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論