素数判定的三种方法(cpp代码)
文章目录 一般方法 埃拉托斯特尼筛法(埃氏筛) 线性筛 一般方法 原理概述: 1不是质数也不是合数,特殊处理; 从2枚举到 √x,若有能除尽的数直接返回x不是素数 Q:为什么枚举到√x? 若m整除n(其中n>根号m)则m=n*k。 若m不整除从1除到√m的数它就不可能整除根号m后面的数。 如果根号m有小于√m的因子X,那么N必定有大于√m的因子Y与X对应。 而且X *Y=m (来源:百度) 实现说明: 略 bool isPrime_usual ( int x ) { if ( x == 1 ) return false ; for ( int i = 2 ; i * i <= x ; i ++ ) if ( x % i == 0 ) return false ; return true ; } 埃拉托斯特尼筛法(埃氏筛) 原理概述: 从最小的素数2开始,2…3…5…将这些数的倍数标为合数。 实现说明: 首先要有一个数组vis,用来标记那些数是素数,所得结果也存在这个数组,并都初始化为true(即默认所有数都是素数) 从2开始枚举,若vis[i]==true,则用一个循环去将vis[i]的倍数都标记为非素数。个人感受j从i * i开始好一些,有一些从j=2*i开始会降低效率(重复筛)。 bool vis [ Maxn ] ; void isPrinme_era ( ) {