杭电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);
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值