我试图通过找出所有的除数来找到完美的数字。如果它们的总和等于数字,则打印出数字。但显然它没有用。
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;
}
}
}
}
答案 0 :(得分: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上看到更好的公式。
答案 1 :(得分: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;
}