求一个数的所有真因子的和的方法

方法一:利用唯一分解定理。

               任何一个大于一的自然数N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。

                N=pow(p1,a1)*pow(p2,a2)*pow(p3,a3)*....*pow(pn,an);

              全体正因数和:

              sum=(1+pow(p1,1)+pow(p1,2)+...+pow(p1,a1))*(1+pow(p2,1)+...+pow(p2,a2))*...* (1+pow(pn,1)+...+pow(pn,an));

方法二:利用筛选法求因数和。

for(int i=1; i<=500100; i++)
        for(int j=2*i; j<1000010; j+=i)
            s[j]+=i;//求因数和

方法三:利用反比例函数的性质。

                反比例函数关于y=x对称。

                求n的所有正因数,无非是判断 1,2,3,4...n-1这n-1个数中有那几个数能够被n整除。

                 此时你会不会想起调和级数的求解呢?     

   类似于调和级数求解的代码:  

        int k=sqrt(n);
        int ans=1;
        int r=0;
        for(int i=2;i<=k;i++)
        {
            if(n%i==0)
            {
                ans+=i;
                r=n/i;
                ans+=r;
            }
        }
        if(k*k==n)
            ans-=k;

 

你可能感兴趣的:(数论)