质数
质数
一、定义:
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
二、定理:
算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=〖p1〗^a1 〖p2〗^a2 〖p3〗a3…pnan,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式。最早证明是由欧几里得给出的,由陈述证明。此定理可推广至更一般的交换代数和代数数论。
三、质数的判定
一般采用试除法。
从2试除到√n
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=2;i*i<=n;i++) //cmath中sqrt函数效率不高
if(n%i==0) {
cout<<"NO";
return 0;
}
cout<<"Yse";
return 0;
}
四、筛素数
1.Eratosthenes筛选法
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
bool v[100000];
void shai()
{
for(int i=2;i<=n;i++)
{
if(v[i]) continue;
cout<<i<<" ";
for(int j=2;j*i<=n;j++)
v[i*j]=1;
}
}
int main()
{
cin>>n;
shai();
}
2.线性筛
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
bool shu[10000000];
int prime[10000];
void shai()
{
for(int i=2;i<=n;i++)
{
if(!shu[i])
{
prime[++m]=i;
cout<<i<<" ";
}
for(int j=1;j<=m;j++)
{
shu[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
cin>>n;
shai();
}
五、质因数分解
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int p[10000],c[1000];
int main() {
int n,i=2,m=0;
cin>>n;
while(n!=1) {
if(n%i==0) {
n/=i;
p[++m]=i;
c[m]++;
while(n%i==0) {
c[m]++;
n/=i;
}
}
i++;
}
for(int i=1; i<m; i++)
cout<<p[i]<<"^"<<c[i]<<"*";
cout<<p[m]<<"^"<<c[m];
}
又水了一篇博客
2021-03-21 星期日