素数
判断是否为素数(一般方法):
时间复杂度O(sqrt(n))
//1 bool Find_prime(int n) { if(n<=1) return false;//特判 else{ for(long long i=2;i*i<=n;i++){//开longlong防止i*i溢出 if(n%i==0) return false; } return true; } } //2 bool Find_prime(int n) { int m=sqrt(1.0*n); if(n<=1) return false;//特判 for(int i=2;i<=m;i++){ if(n%i==0) return false; } return true; }
素数表的获取:
1.一般方法:范围在10^5内可以使用
时间复杂度:O(n loglogn)
const int MAX=100; int prime[MAX],pNum=0;//pNum素数个数 bool p[MAX]={0};//素数为true bool is_Prime(int n) { if(n<=1) return false;//特判 else{ for(long long i=2;i*i<=n;i++){//开longlong防止i*i溢出 if(n%i==0) return false; } return true; } } void find_prime(){ for(int i=1;i<=MAX;i++){ if(is_prime(i)==true){ prime[pNum++]=i; p[i]=true; } } }
2.筛法:
时间复杂度:O(n loglogn)
如果i为素数则i的倍数不为素数,前提是首先知道2为素数,因此第一次循环从2开始。表长至少要比n大1
const int MAX=101;//100内的素数 int prime[MAX],pNum=0;//pNum素数个数 bool p[MAX]={0};//素数为false void Find_prime(){ for(int i=2;i<MAX;i++){//不能写i<MAX if(p[i]==false){ prime[pNum++]=i; for(int j=i+i;i<MAX;j+=i){ p[j]=true; } } } }

浙公网安备 33010602011771号