1.快速查找一定范围内的素数
memset(a,0,sizeof(a));//memset()只能初始化为0、-1
for(i=2;i<N;i++)
{
if(!a[i])
{
for(j=2*i;j<N;j+=i)
a[j]=1;
}
}
2.查找一个数比自己小的所有因数和的时候(或者寻找完数:6、28、496、8128)
其中,完全数是一些特殊的自然数,它所有的真因子(即除了本身以外的约数 )的和,恰好等于它本身。即:28=1+2+4+7+14
memset(a,0,sizeof(a));
a[1]=-1,a[2]=0;
for(i=2;i<N/2;i++)
{
for(j=2*i;j<N;j+=i)
a[j]+=i;
}
printf("%d\n",a[num]+1);
3.查找反素数
1)反素数:
对于任何正整数x,其约数的个数记做g(x),如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。
2)性质
性质一:一个反素数的质因子必然是从2开始连续的质数.
性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef __int64 ll;
ll mmax,res,n;
const int a[16]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
void DFS(ll num,ll sum,int k,int limit)
{
if(sum>mmax){
mmax=sum;
res=num;
}
else if(sum==mmax&&res>num)
res=num;
if(k>15) return;
ll temp=num;
for(int i=1;i<=limit;i++){
if(temp*a[k]>n) break;
temp*=a[k];
//sum*(i+1):如10=2^1*5^1,res(10)=(1+1)*(1+1)
DFS(temp,sum*(i+1),k+1,i);
}
}
int main()
{
int i,T;
scanf("%d",&T);
for(i=1;i<=T;i++)
{
scanf("%d",&n);
res=mmax=0;
DFS(1,1,1,50);
printf("Case #%d: %d\n",i,res);
}
return 0;
}