为什么此代码返回一个数字的因子总和?查找因子总和
在一些项目欧拉问题中,您被要求计算因子的总和作为问题的一部分。在其中的一个论坛上,有人发布了以下Java代码作为找出这个总和的最佳方式,因为您实际上并不需要找到个别因素,只有主要因素(您不需要了解Java,可以跳到我的总结如下):
public int sumOfDivisors(int n)
{
int prod=1;
for(int k=2;k*k<=n;k++){
int p=1;
while(n%k==0){
p=p*k+1;
n/=k;
}
prod*=p;
}
if(n>1)
prod*=1+n;
return prod;
}
现在,我试了很多次,我看到它的工作原理。问题是,为什么?
说你因素100
:1,2,4,5,10,20,25,50,100
。总和是217
。素因子分解是2*2*5*5
。此功能为您提供[5*(5+1)+1]*[2*(2+1)+1] = [25+5+1]*[4+2+1] = 217
保理8
:1,2,4,8
。总和是15
。素因子分解为2*2*2
。这个功能可以使您[2*(2*(2+1)+1)+1]=15
算法归结为(使用Fi
意味着因素F或F子我的第i个指标):
return product(sum(Fi^k, k from 0 to Ni), i from 1 to m)
其中m
是唯一素因子数,Ni
是每个唯一因素在素因子分解中出现的次数。
为什么这个公式等于这些因子的总和?我的猜测是它等于通过分配性质的每个唯一因素组合(即每个唯一因素)的总和,但我不知道如何。
我想你的意思是[2 *(2 *(2 + 1)+1)+1] = 15 – 2010-12-17 02:30:35
@Adrian Petrescu:是的,谢谢。我会修复它 – 2010-12-17 02:35:59