质数的判定
#include<iostream>
#include<cstdio>
using namespace std;
bool is_prime(int x)
{
for(int i=2;i<=x/i;i++)
if(x%i==0)
return false;
return true;
}
int main()
{
int n;
cin>>n;
if(is_prime(n)==0)
printf("%d不是质数\n",n);
else
printf("%d是质数\n",n);
return 0;
}
质数的筛选(Eratosthenes筛法和线性筛法)
Eratosthenes
//求1~n之间所有的质数(n<1e7)
#include<iostream>
using namespace std;
const int N=1e7;
int p[N],l;
bool st[N];
void primes(int n)
{
st[1]=true;
for(int i=2;i<=n;i++)
if(!st[i])
{
p[++l]=i;
for(int j=i*i;j<=n;j+=i)
st[j]=true;
}
}
int main()
{
int n;
cin>>n;
primes(n);
for(int i=1;i<=l;i++)
{
printf("%10d",p[i]);
if(i%10==0)puts("");
}
return 0;
}
线性筛法
//求1~n之间所有的质数(n<1e7)
#include<iostream>
using namespace std;
const int N=1e7;
int p[N],l;
int v[N];
void primes(int n)
{
for(int i=2;i<=n;i++)
{
if(!v[i])
{
p[++l]=i;
v[i]=i;
}
for(int j=1;j<=l;j++)
{
if(p[j]>v[i]||p[j]>n/i)break;
v[i*p[j]]=p[j];
}
}
}
int main()
{
int n;
cin>>n;
primes(n);
for(int i=1;i<=l;i++)
{
printf("%10d",p[i]);
if(i%10==0)puts("");
}
return 0;
}
质因子分解
#include<iostream>
using namespace std;
const int N=1e7;
int p[N];
int c[N];
int m;
void divide(int n)
{
for(int i=2;i<=n/i;++i)
{
if(n%i==0)
{
p[++m]=i,c[m]=0;
while(n%i==0)n/=i,c[m]++;
}
}
if(n>1)p[++m]=n,c[m]++;
}
int main()
{
int n;
cin>>n;
divide(n);
for(int i=1;i<=m;++i)
cout<<p[i]<<"^"<<c[i]<<endl;
return 0;
}