Java語言求解完美數程式碼分析,java語言求解代碼

來源:互聯網
上載者:User

Java語言求解完美數程式碼分析,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痛點

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

重點是在第三步,如何求真因數和?方法很簡單,要Crowdsourced Security Testing道將所有真因數(有不清楚真因數概念的同學,去看看)和加上該數本身,會等於該數的兩倍(有些同學不知道,現在應該也知道了吧?),例如:

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

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

發現沒有?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語言求解完美數程式碼分析的全部內容,希望對大家有所協助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.