数论-素数
Posted ac-ac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论-素数相关的知识,希望对你有一定的参考价值。
一:三种基本的素数判定
1:穷举法:适用于数据较小的时候。时间复杂度:O()
int isPrime(int n) { if(n==1||n==0) return 0; int m = sqrt(n+0.5); for(int i = 2; i <= m; i++) if(n%i==0) return 0; return 1; }
2:埃拉托瑟尼筛法求素数 时间复杂度:O()
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 1e6; int book[maxn]; int prime[maxn]; int main(void) { int n; int num; while(~scanf("%d",&n)) { num = 0; for(int i = 2; i <= n; i++) { if(book[i]==0) prime[num++] = i; for(int j = i * i; j <= n; j += i) { book[j] = 1; } } for(int i = 0; i < num; i++) cout<<prime[i]<<endl; } return 0; }
3:欧拉筛法
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 1e6; int prime[maxn]; int book[maxn]; int main(void) { int n; int num; while (~scanf("%d", &n)) { num = 0; for (int i = 2; i <= n; i++) { if (book[i]==0) prime[num++] = i; for (int j = 0; j < num; j++) { if (i*prime[j] > n) break; // 过大的时候跳出 book[i*prime[j]] = 1; if ((i%prime[j]) == 0) // 如果i是一个合数,而且i % prime[j] == 0 break; } } for (int i = 0; i < num; i++) printf("%d ", prime[i]); } return 0; }
以上是关于数论-素数的主要内容,如果未能解决你的问题,请参考以下文章