VJ训练 HDU - 1215 七夕节

题意:

找到一个数的所有因子之和并输出它。数字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;
}


猜你喜欢

转载自blog.csdn.net/zhengyuan233/article/details/53360143
今日推荐