2

我得到了一个任务来创建一个显示 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% 正确划分时间。

4

2 回答 2

4

您的分解代码错误。你可以像这样修复它:

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

您的旧代码不起作用的一个原因是您误解了%操作员的工作方式。它计算左手边除以右手边的余数,对于所有数字也是如此r % 1 == 0true因为1除以一切;r % 2 == 0是一种检测偶数的方法,依此类推。

另一个原因是你一直到 100 来寻找除数。这必然包括a,它会自动将总数置于数字本身之上,因为1它已经在列表中。

一旦你得到这个工作,你可以通过删除因素列表来简化代码。由于所有因素的总和就是您所需要的,您不妨在因式分解循环中计算它,并删除它后面的循环:

sum = 0;
for (int i = 1 ; i < a; i++) {
    if (a % i == 0) {
        sum += i;
    }
}
于 2014-02-06T22:54:54.407 回答
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) { // ...

反而。

于 2014-02-06T23:09:52.860 回答