XTU-OJ 1172-因子和

题目描述

给一个正整数n,请求n所有因子的累加和。

输入

每行一个整数n,1≤n≤100,000,000。如果n为0表示输入结束,不需要处理。

输出

每行输出一个结果。

样例输入
1
2
3
4
0

样例输出
1
3
4
7

解题思路:一眼看见数据 n 最大能到 1e8,用暴力不知道是否会超时,这里就继续沿用 质因数分解 的思路来求解。

任何数都可以分解成质因数的乘积:   n = a^x * b^y * c^z * ·····

如:14 = 2*7 、 36 = 2^2*3^2  

质因数之和就等于   (a^0 + a^1 +····+ a^x) * (b^0 + b^1 +····+ b^x) * (c^0 + c^1 +····+ c^x) * ·····。

AC代码:

#include 

int main()
{
    int n,cnt,t;
    __int64 sum,ans;
    int num[50] = {0};
    while (scanf("%d",&n) != EOF && n != 0) 
    {
        cnt = 0; sum = ans = t = 1; 
        for (int i=2; i*i<=n; i++) 
        {
            for (int j=0; n%i==0; j++)          // 找到所有的质因数,并保存
            {
                n/=i;
                num[++cnt] = i;
            }
        }
        if (n != 1)    num[++cnt] = n;

        for (int i = 1; i <= cnt; i ++) 
        {
            if (num[i] != num[i-1])   // 如果相邻的质因数不一样,重新计算(从a 跳到 b)
            {
                sum *= t;
                ans = t = 1;
            }
            t = t + ans*num[i];       // 计算同一质因数,并求和 (a^0 + a^1 +····+ a^x)
            ans *= num[i];
        }
        sum *= t;                     // 最后要补充一步,思考下为什么。   
        printf("%I64d\n",sum);
    }
    return 0;
}

你可能感兴趣的:(湘大OJ练习解析,算法,数据结构)