# Java~請幫我除錯<arrayList>

[5, 12, 9, 6, 1, 4, 8, 6]

# of even #s - 5

# of odd #s - 3

# of perfect #s - 2

[5, 12, 3, 7, 28, 496, 81, 65, 33, 11]

# of even #s - 3

# of odd #s - 7

# of perfect #s - 2

code如下:

import java.io.File;

import java.io.IOException;

import java.util.Scanner;

import java.util.ArrayList;

import java.util.Collections;

import static java.lang.System.*;

class NumberAnalyzer

{

private ArrayList<Integer> list;

private int evenCount;

private int oddCount;

private int perfectCount;

public NumberAnalyzer()

{

list=new ArrayList<Integer>();

evenCount=oddCount=perfectCount=0;

}

public NumberAnalyzer(String numbers)

{

list=new ArrayList<Integer>();

Scanner scan = new Scanner(numbers);

while (scan.hasNext())

{

}

}

public void countOdds()

{

int oddCount=0;

for (int x =0;x<list.size();x++)

{

if (list.get(x)%2!=0)

oddCount++;

}

}

private boolean isOdd(int num)

{

return false;

}

public void countEvens()

{

int evenCount = 0;

for (int x = 0;x<list.size();x++)

{

if (list.get(x)%2!=1)

evenCount++;

}

}

private boolean isEven(int num)

{

return false;

}

public void countPerfects()

{

}

private boolean isPerfect(int num)

{

int total=0;

return false;

}

public String toString( )

{

return list

+ "\n# of even #s - " + evenCount

+ "\n# of odd #s - " + oddCount

+ "\n# of perfect #s - " + perfectCount + "\n\n";

}

}

public class Lab21b

{

public static void main( String args[] )

{

NumberAnalyzer test = new NumberAnalyzer("5 12 9 6 1 4 8 6");

test.countOdds();

test.countEvens();

test.countPerfects();

out.println(test);

test = new NumberAnalyzer("5 12 3 7 28 496 81 65 33 11");

test.countOdds();

test.countEvens();

test.countPerfects();

out.println(test);

}

}

### 1 個解答

• 1 0 年前
最佳解答

您好：

一、完美數部份

countPerfects(), isPerfect() 是使用既有的 method。

/**

* 計算完美數的數目。<Br>

*/

public void countPerfects() {

// 計算完美數數目

perfectCount = 0;

for (int i = 0, size = this.list.size(); i < size; i++) {

Integer temp = this.list.get(i);

if (this.isPerfect(temp.intValue())) {

perfectCount++;

}

}

}

/**

* 判斷是否完美數。<br>

* 當自身以外的因數加總等於自身，則為完美數。

* @param num int

* @return boolean

*/

private boolean isPerfect(int num) {

if (num <= 1) {

return false;

}

int total = 1;

// 加總真因數

for (int i = 2; i <= num / 2; i++) {

if (num % i == 0) {

total += i;

}

}

return num == total;

}

二、計算奇偶結果為0的部分，主要是因為在 countEvens(), countOdds() 中，分別多宣告了底下的區域變數。

int evenCount = 0;

以及

int oddCount = 0;

上列區域變數會導致計算時不正確。移除掉應可正確運算。或許您是想替變數歸零。若是如此，則不必使用到宣告。如:

evenCount = 0;

本回答中的數學定義參考了下列網站:

1.良葛格學習筆記

http://caterpillar.onlyfun.net/Gossip/AlgorithmGos...

2.白啟光先生的數學嘉年華

http://xserve.math.nctu.edu.tw/people/cpai/carniva...

2007-02-06 11:46:15 補充：

假如輸入的數字相當多，且數字較大(甚至輸入的數字大多重複的情形)。為了追求效率，或許可以先計算一定範圍內的所有完美數。然後再使用已經算出的完美數來比對。

這樣可以避免重複計算是否完美數。

不過，話說回來，我剛剛才知道10000以內完美數只有4個....

分別是 6,28,496,8128。呵，數學真是有趣 XD