为什么计算完美数字的程序不打印任何东西?

时间:2014-02-06 22:47:41

标签: java integer perfect-numbers

我得到了一个创建程序的任务,该程序显示1到100之间的完美整数。这是实际的任务:

  

创建一个PerfectIntegers应用程序,显示所有完美的整数,最多100个。完整整数是一个数字,它等于除了它自身之外的所有因子的总和。例如,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%的时间内正确分割。

2 个答案:

答案 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;
    }
}

答案 1 :(得分: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) { // ...

代替。