题意:
找到一个数的所有因子之和并输出它。数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
思路:
如果单纯的循环找因子会超时。需要简化算法即只取到sqrt(n),如果找到一个被整除的因子那么就得到了另一个能够被整除的因子。
注意要讨论像9这种恰好为因子平方的特殊情况。
代码:
#include<stdio.h>
#include<math.h>
int a[500010] = {0};
int number(int x)
{
int j;
for(j = 2; j <= sqrt(x); j++)
if(x % j == 0)
{
a[x] += j;
if(j < sqrt(x))//特判恰好开方得到整数的的情况。只加一遍即可
a[x] += x / j;
}
return a[x] + 1;
}
int main()
{
int N, x, k;
scanf("%d", &N);
for(k = 1; k <= N; k++)
{
scanf("%d", &x);
if(a[x] == 0)
a[x] = number(x);
x == 1 ? printf("0\n") : printf("%d\n", a[x]);//特判1的情况。
}
return 0;
}
一种更快的打表法代码:
#include <stdio.h>
#include <stdlib.h>
int a[500000];
int main()
{
int T,n,i,j;
memset(a,0,sizeof(a));
for(i=2; i<=250000; i++)
for(j=2*i; j<=500000; j+=i)
a[j]+=i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
if(n==1)
printf("0\n");
else
printf("%d\n",a[n]+1);
}
return 0;
}