亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java語言如何求解完美數

發布時間:2021-08-09 09:30:32 來源:億速云 閱讀:178 作者:小新 欄目:編程語言

這篇文章主要介紹了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分析

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

1.求出一定數目的質數表

2.利用質數表求指定數的因式分解

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

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語言如何求解完美數”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴国县| 荥经县| 吴桥县| 禄丰县| 阜新| 阿克陶县| 丹阳市| 仪征市| 临清市| 南昌市| 杭锦后旗| 台南县| 永登县| 长宁县| 邓州市| 白沙| 武山县| 繁昌县| 额敏县| 东宁县| 沙坪坝区| 汪清县| 垫江县| 竹北市| 鸡西市| 黄石市| 水城县| 子长县| 奎屯市| 赤城县| 隆林| 华亭县| 白玉县| 织金县| 赣州市| 上高县| 山阴县| 汉沽区| 钦州市| 华安县| 太原市|