质数的筛选
1.Eratosthenes筛选法
void s(int n)
{
memset(book,0,sizeof(book));
for(int i=2;i<=n;i++)
{
if(book[i])
continue;
printf("%d ",i);
for(int j=i;j<=n/i;j++)
book[i*j]=1;
}
}
线性筛法
int book[maxn],prime[maxn];
void s(int n)
{
memset(book,0,sizeof(book);
g=0;
for(int i=2;i<=n;i++)
if(book[i]==0)
{
book[i]=i;
prime[++g]=i;
}
for(int j=1;j<=m;j++)
{
if(prime[j]>book[i]||prime[j]>n/i)
break;
book[i*prime[j]]=prime[j];
}
for(int i=1;i<=n;i++)
printf("%d\n",prime[i]);
}
欧拉筛法
#include<stdio.h>
#define N 100
int i,j,pri[N],vis[N];
void s()
{
for(i=2;i<=N;i++)
{
if(!vis[i]) pri[++pri[0]]=i;
for(j=1;j<=pri[0]&&i*pri[j]<=N;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
}
int main()
{
s();
for(i=1;i<N;i++)
printf("%d %d\n",i,vis[i]);
return 0;
}
质因数分解
void s(int n)
{
int m=0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
p[++m]=i;
c[m]=0;
while(n%i==0)
{
n=n/i;
c[m]++;
}
}
}
if(n>1)
p[++m]=n,c[m]=1;
for(int i=1;i<=m;i++)
printf("%d^%d\n",p[i],c[i]);
}