题意:
输入一个数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);
}
}