在我的課程中,我們被分配了一個問題來創建一個「factorizer」應用程序,它可以計算任何數字的素數因子分解,直到一個非常大的數字。他給了我們一個Number.java
類,它可以計算出數字是否爲素數或不是明顯的用途。有用或浪費內存?
// Number.java
public class Number {
long n;
public Number(long number) {
n = number;
}
boolean isPrime() {
for(long k = 2; k < n; k++) {
if(n % k == 0) return false;
}
return true;
}
}
與此唯一的問題是,Number.java
類是它有一個構造函數,在我的腦海在這種情況下,不那麼「移動」。我的意思是,在我的循環中計算參數的主要因素,一個新的Number對象被一遍又一遍地創建。在頂部定義一個private Number isPrimeFactor = new Number()
而不是爲每個循環的重複創建一個新的Number isPrimeFactor = new Number(i)
是否更有意義?我問了我的老師這件事,但他並沒有真正回答。以下是我正在談論的一些示例代碼。
while (remainder!=0 && j<n) {
Number isFactor = new Number(j);
if(isFactor.isPrime() && remainder%j==0) {
remainder = remainder/j;
factor[i]=j;
temp = (int) j;
multiplicity[temp] = multiplicity[temp]+1;
i++;
} else {
j++;
}
}
首先,您只需要Number,Integer和Long的特定子集。浮動和雙重沒有意義。順便說一句,爲了檢查數字n是否爲素數,不需要檢查大於n/2的數字是否是除數,因爲給定n,沒有大於n/2的除數。 – m0skit0 2013-03-14 15:25:54
'k'只需要上升到'sqrt(n)',這對於大'n'來說會更快。關於循環和創建對象,讓Java的垃圾收集器處理它。 – 2013-03-14 15:26:03
這聽起來很像過早的優化。看起來你會爲每個數字創建數百或數千個分區,但是他們正在考慮創建初始對象的小開銷。 – msam 2013-03-14 15:31:32