zcmu-1409 因子和(素数筛入门)

 感谢博客链接

Description

求一个数的因子和很简单,所以小明很懒就想让你帮忙算一下区间a到b中哪个数的因子和最大,并输出这个数和他的每个因子。

Input

输入a和b,(0<a<=b<10^6).

Output

输出这个数和他的每个因子(相同情况输出最小的),因子从小到大输出。

Sample Input

1 10

Sample Output

10 = 1 + 2 + 5 

思路:

好了,先跟你明说吧,普通算法都疯狂超时,普通预处理也超时,那么把目光看向素数筛,成了

int prime[maxn];
void isprime()
{
    int i,j;
    memset(prime,1,sizeof(prime));
    for(i=2;i<=maxn/2;i++)
        for(j=i+i;j<maxn;j+=i)
            prime[j]=0;
}

原理就是,有个因数(比如3),后面每一个数,如果是三的倍数的话,它都有一个因数是3,所以把每个每一个是3的倍数的数  的因子和sum[i] 加上3。

还不懂就自己手算,算几个就明白了!

【通过代码】

#include <stdio.h>
#include <math.h>
#include <string.h>
const int maxn = 1e6 + 5;
int arr[maxn],sum[maxn];
int t = 0;

void getsum()//素数筛法,预处理每一个数的因子和,后面只要查找就行了,不用重复计算
{
    int i,j;
    memset(sum,1,sizeof(sum));
    for(i = 2;i <= maxn / 2;i++)
    {
        for(j = i + i;j < maxn;j += i)
            sum[j] += i;
    }
}

int main()
{
    getsum();
    int a,b;
    while(scanf("%d%d",&a,&b) != EOF)
    {
        int maxsum = 0,dis = 0;
        for(int i = a;i <= b;i++)
        {
            if(sum[i] > maxsum)
            {
                maxsum = sum[i];
                dis = i;//记录因子和最大的那个数
            }
            
        }
        printf("%d = 1",dis);
        for(int i = 2;i <= dis / 2;i++)
        {
            if(dis % i == 0)
                printf(" + %d",i);
        }
        printf("\n");
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hzyhfxt/article/details/82026460
今日推荐