11.素数判断及打印素数表-优化版
1. 素数判断
素数定义:除了1和本身以外,不能被任何其他整数整除的一类数;
<mark>如果这个数X,isprime(x)返回1则是素数 返回0则非素数</mark>
int isprime(int x)
{
if(x<=1) return 0;
for(int i=2;i<sqrt(x);i++)
{
if(x%i==0) return 0;
}
return 1;
}
int main()
{
cout<<isprime(x);//x为判断的数
return 0;
}
2.素数表的获取
<mark>①暴力枚举</mark>
根据时间复杂度 n<100000 都是没问题的
时间复杂度O(n根号n)
int isprime(int x)
{
if(x<=1) return 0;
for(int i=2;i<sqrt(x);i++)
{
if(x%i==0) return 0;
}
return 1;
}
int main()
{
cout<<isprime(x);//x为判断的数
return 0;
}
int main()
{
int n;// 根据时间复杂度 n<100000 都是没问题的
cin>>n; // 求2-n之间的所有素数
for(int i=2;i<=n;i++)
{
if(isprime(i)) cout<<i<<endl;
}
return 0;
}
<mark>②埃尔筛法</mark>
根据时间复杂度 n<10000000 都是没问题的
时间复杂度O(nloglogn)
#include <bits/stdc++.h>
using namespace std;
const int maxn=100;//这里是求1-100间的素数表
int a[maxn+1],cn=0;//cn计数素数的多少 同时为存放素数的数组a当成下标使用
bool p[maxn+1]={false}; //p重元素flase表示为素数 true表示非素数
void findprime()
{
for(int i=2;i<=maxn;i++)
{
if(p[i]==false) a[cn++]=i; //flase是素数处存入a数组
for(int j=i+i;j<=maxn;j=j+i)
{
p[j]=true; //将a中的素数的所有倍数定义为非素数
}
}
}
int main()
{
findprime();
for(int i=0;i<cn;i++) cout<<a[i]<<endl; //输出
return 0;
}
<mark>③欧拉筛法</mark>
点我直达