2014-02-06 102 views
2

我得到了一個分配創建一個顯示一至100.下面是實際的分配完美的整數的程序:爲什麼我的程序不能計算完美的數字?

創建一個顯示所有完美的整數高達100完美的整數是一個PerfectIntegers應用數字等於除自身以外的所有因素的總和。例如,6是一個完美的數字,因爲1 + 2 + 3 = 6。應用程序應該包含一個布爾方法isPerfect()。

我想和這個想出了:

import java.util.ArrayList; 
public class PerfectIntegers { 
public static boolean isPerfect(int a){ 
    ArrayList<Integer> factors = new ArrayList<Integer>(); 
    int sum=0; 
    boolean is; 
    for (int i=1; i<=100; i++){ 
     double r=a/i; 
     if (r%1==0){ 
      factors.add(i); 
     } 
    }for (int i=0;i<factors.size();i++){ 
     sum+=factors.get(i); 
    }if (sum==a){ 
     is=true; 
    }else{ 
     is=false; 
    }return is; 
} 
public static void getInts(){ 
    for (int i=2; i<=100; i++){ 
     boolean is=isPerfect(i); 
     if (is!=false){ 
      System.out.print(i+" "); 
     } 
    } 
} 
public static void main(String[] args) { 
    getInts(); 
} 

} 

Eclipse中沒有表現出任何錯誤,但是當我嘗試運行它,該程序被終止,我什麼也沒得到。

問題可能與double r,因爲它沒有100%的時間分配正確。

+0

也許'是'一直是錯誤的。你嘗試過調試嗎? –

回答

4

你的分解代碼是錯誤的。你能解決這個問題是這樣的:

for (int i = 1 ; i < a; i++) { 
    if (a % i == 0) { 
     factors.add(i); 
    } 
} 

一個原因你的舊代碼,沒有工作是你誤解了%運營商的工作。它計算左邊的除法的剩餘部分的右邊,所以r % 1 == 0將爲true爲所有數字,因爲1劃分一切; r % 2 == 0是一種檢測偶數的方法,依此類推。

另一個原因是,你一路走到100尋找因數。這必然包括a,這會自動將總數超過數字本身,因爲1已在列表中。

一旦你得到這個工作,你可以通過刪除因子列表來簡化代碼。由於各種因素的總和是所有你需要,你還不如計算它在分解循環,並丟棄它後面的循環:

sum = 0; 
for (int i = 1 ; i < a; i++) { 
    if (a % i == 0) { 
     sum += i; 
    } 
} 
0

dasblinkenlight已經提供了正確的答案。讓我補充一點,因爲這似乎是一個(可能分級)的任務,所以您可能會考慮重構getInts()方法。

boolean is=isPerfect(i); 
if (is!=false){ 
    System.out.print(i+" "); 
} 

實際上等於

if (isPerfect(i)){ 
    System.out.print(i+" "); 
} 

因爲isPerfect()已經返回了可以在if語句的條件內使用一個布爾值。 可以爭辯說(即使我強烈反對在這個具體的例子中),它可能更易於讀取第一個變量中存儲返回值的變量。但即使如此,你不應該檢查

if (is!=false) { //... 

,但應該使用

if (is) { // ... 

代替。

相關問題