基本概念
对于质数有明确概念的可以跳过这里
简单来说,严格按照数学概念看,素数就是只有1和它本身两个因数的数。
但在编程中,判断素数得有一个范围,不然死循环就完蛋了。粗略算一下,假设要判断的数是n,那么就需要从2一直算到n。
再仔细看看,如果n=19,那么算到18,而判断181没有任何意义,18*2>19,所以判断根号19即可。
此运算在c++中,写为“sqrt(n)”,*需要头文件cmath
编程实现
基础算法
适合于单独判断某一个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include<iostream> #include<cmath> using namespace std; int main(){ int n; cin>>n; for(int i=2;i<sqrt(n);i++){ if(n%i==0){ cout<<"no"; return 0; } } cout<<"yes"; return 0; }
|
埃氏筛法
适合于批量判断或统计一个范围内的所有素数
思路就是用数组进行打标记,先初始化为1,假设所有数都是素数,然后将每个数的n倍赋为0,表示不是素数
上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include<iostream> #include<cmath> using namespace std; int main() { int a,b; int flag[1000]; for(int i=0; i<1000; i++) { flag[i]=1; } cin>>a>>b; for(int i=2; i<=sqrt(b); i++) { for(int j=2*i; j<=b; j+=i) { flag[j]=0; } } flag[0]=0; flag[1]=0; for(int i=a; i<=b; i++) { if(flag[i]==1) { cout<<i<<" "; } } return 0; }
|
该解释的都解释过了
推荐题目
推荐一道我写过题解的题目,来自洛谷
洛谷题目链接
自己写的题解链接