0

我试图通过找出所有除数来找到完美的数字。如果它们的总和等于数字,则打印出数字。但显然它不起作用。

import acm.program.*;

public class PerfectNumber extends ConsoleProgram{
    public void run() {
        for (int n = 1; n < 9999; n++) {                                                                    
            for (int d = 2; d < n - 1; d++) {
                //d is the potential divisor of n, ranging from 2 to n-1,// 
                //not including 1 and n because they must be the divisors.//
            if (isPerfectNumber(n,d)) 
                print(n );
        }
    }
}

//method that determines if n is perfect number.//
    private boolean isPerfectNumber(int n, int d) {
         while (n % d == 0) {
         int spd = 1;
         spd += d;
         if (spd == n) {
         return true;
         } else {   
          return false;
             }
        }
    }
}
4

2 回答 2

1

查看您案例中的代码大多数情况下会返回 false。我认为您正在寻找的内容有点错误。因为 d 小于 n,并且 n 除以 d 将始终大于 0。同样在该循环中,您永远不会更改 d 的值。

一个解决方案可能是:

     public void run() {
            for (int n = 1; n < 9999; n++) 
{           spd=1;                                                         
                for (int d = 2; d <= n/2; d++) { //no need to go further than n/2
                    //d is the potential divisor of n, ranging from 2 to n-1,// 
                if(n%d==0) spd+=d; //if n divides by d add it to spd.

            }
            if(spd==n) print(n);
        }

试试这个,让我知道它是否适合你。

我在这里找到了一些很酷的东西:http ://en.wikipedia.org/wiki/List_of_perfect_numbers 。你应该使用这个公式更快:2^(p−1) × (2^p − 1)。您可以在 wikilink 上更好地查看公式。

于 2013-11-08T16:06:53.073 回答
0

方法 isPerfect 应该是这样的:

public static boolean isPerfect(int number) {
    int s = 1;
    int d = number / 2;
    for(int i = 2; i <= d; i++) {
        if (number % i == 0) s += i;
    }
    return s == number;
}
于 2013-11-08T16:06:57.170 回答