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;
}