我正在寻找一种算法来查找给定数字是否是完美数字。
我想到的最简单的是:
有更好的方法吗? 在搜索时,一些欧几里德的工作出现了,但没有找到任何好的算法。这个高尔夫手稿也没有帮助:https://stackoverflow.com/questions/3472534/checking-whether-a-number-is-mathematically-a-perfect-number。
数字等可以在实际使用中缓存等[我不知道在哪里使用完美的数据:)] 然而,由于这是在采访中提出的,我假设应该有一种“可导出”的方式来优化它。
谢谢!
答案 0 :(得分:9)
如果输入为偶数,请查看其格式是否为2^(p-1)*(2^p-1)
,p
和2^p-1
素数。
如果输入为奇数,则返回“false”。 : - )
有关详细信息,请参阅Wikipedia page。
(实际上,由于只有47个完美数字,少于2500万个数字,你可以从一个简单的表开始。问问面试官你是否可以假设你使用的是64位数字,例如...... )
答案 1 :(得分:0)
这是一个快速算法,只是为了好玩,在PHP中 - 只使用一个简单的for
循环。您可以轻松将其移植到其他语言:
function isPerfectNumber($num) {
$out = false;
if($num%2 == 0) {
$divisors = array(1);
for($i=2; $i<$num; $i++) {
if($num%$i == 0)
$divisors[] = $i;
}
if(array_sum($divisors) == $num)
$out = true;
}
return $out ? 'It\'s perfect!' : 'Not a perfect number.';
}
希望这有帮助,不确定这是否是您正在寻找的。 p>
答案 2 :(得分:0)
编辑:Dang,我的采访失败了! :-(
在我过于热心地尝试寻找技巧或启发式来改进“因子化+枚举除数+求和它们”的方法时,我没有注意到1模9仅仅是必要的,当然不是足够的条件,在数字(除了6)之外是完美的...
Duh ...平均满足这个条件的偶数为9的偶数,我的算法肯定会找到一些太多的完美数字;-)。
为了赎回自己,坚持并保持使用数字根的建议,但只有作为过滤器,以避免在大多数情况下更昂贵的因子计算。
[原创企图:耻辱之堂]
If the number is even,<br>
compute its [digital root][1].
if the digital root is 1, the number is perfect, otherwise it isn't.
If the number is odd...
there are no shortcuts, other than...
"Not perfect" if the number is smaller than 10^300
For bigger values, one would then need to run the algorithm described in
the question, possibly with a few twists typically driven by heuristics
that prove that the sum of divisors will be lacking when the number
doesn't have some of the low prime factors.
我建议偶数数字根技巧的原因是这个可以在没有任意长度算术库的帮助下计算(如GMP)。它也比质数因子和/或因子分解(2 ^(p-1)*((2 ^ p)-1))中的分解<强>计算成本低得多。因此,如果面试官对奇数的“不完美”回答感到满意,那么该解决方案在大多数计算机语言中都非常有效且可编码。
[第二次和第三次尝试......]
If the number is even,<br>
if it is 6
The number is PERFECT
otherwise compute its [digital root][1].
if the digital root is _not_ 1
The number is NOT PERFECT
else ...,
Compute the prime factors
Enumerate the divisors, sum them
if the sum of these divisor equals the 2 * the number
it is PERFECT
else
it is NOT PERFECT
If the number is odd...
same as previously
关于这个相对奇怪的面试问题......
我在这篇文章中对第二个 andrewdski 对另一个回复的评论表示,这个特殊问题在面向一般目的开发者的采访中是相当奇怪的。
与许多面试问题一样,它可能是面试官没有寻求特定的解决方案,而是为候选人提供机会展示他/她阐明各种方法的一般利弊的能力。此外,如果候选人在回答之前有机会查找MathWorld或Wikipedia等通用资源,这也可能是他/她快速了解其中所提供信息的能力的一个很好的测试。
答案 3 :(得分:0)
#include<stdio.h>
#include<stdlib.h>
int sumOfFactors(int );
int main(){
int x, start, end;
printf("Enter start of the range:\n");
scanf("%d", &start);
printf("Enter end of the range:\n");
scanf("%d", &end);
for(x = start;x <= end;x++){
if(x == sumOfFactors(x)){
printf("The numbers %d is a perfect number\n", x);
}
}
return 0;
}
int sumOfFactors(int x){
int sum = 1, i, j;
for(j=2;j <= x/2;j++){
if(x % j == 0)
sum += j;
}
return sum;
}