杭电OJ(HDOJ):七夕节

题意:

输入一个数n,找出此数的所有因子和,数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6。和就是1+2+3+4+6=16。输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000),输出N的所有因子和。

示例输入:

3
2
10
20

示例输出:

1
8
22

解决方案:

如果直接就穷举,会超时,需要对时间复杂度优化:12的所有因子有1、2、3、4,、6,2是其因子,那么6也是其因子。6之后的数就可以不用使用了,就省了大量的时间。

#include<stdio.h>

int main()
{
    int sum,t,n,i,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        sum=1;
        m=n;
        for(i=2; i<m; ++i)
            if(n%i==0)
            {
                sum+=i;
                if(i*i!=n)// if i*i=n then sum only add i once
                    sum+=n/i;
                m=n/i;
            }
        printf("%d\n",sum);
    }
}


你可能感兴趣的:(C++,ACM,杭电)