数字的因子和

来源:互联网 发布:c语言 线程优先级 编辑:程序博客网 时间:2024/06/01 07:12

设有n=pk11pk22...pknn.
其中p1,p2,...,pnn的质因子,k1,k2,...,kn是质因子相应的指数,
那么有n的所有因子之和(包括1n本身):
sum=(p01+p11+p21+...+pk11)(p02+p12+p22+...+pk22)...(p0n+p1n+p2n+...+pknn) .
代码:
复杂度O(n)

int sum_of_divisor(int n){    int sum = 1;    for(int i = 2; i*i <= n; ++i)    {        int temp = 1;        while(n%i == 0)        {            temp = temp*i + 1;            n /= i;        }        sum *= temp;    }    if(n > 1)        sum *= n + 1;    return sum;}

另外一种更耿直的方法,复杂度也是O(n),直接枚举其因子i(i<n),这样就可以把数字n的小于等于n的因子都算出来,对于n的因子x>n,必然有xi=ni<n,这就是说,在枚举因子i(i<n)的时候,可以同时算出所有的x(x>n)

int divisor_sum(int n){    int m = (int)sqrt(1.0 * n);    int sum = 0;    if(n == 1)        return 1;    for(int i = 1; i <= m; ++i)    {        if(n % i == 0)        {            if(n/i != i)                sum += n/i + i;            else//此时i*i=n,故只取一个                sum += i;        }    }    return sum;}
原创粉丝点击