
言归正传,今天这篇文章想讲讲关于素数的算法。
闲话少说,先看个定义:只有1和它本身两个因数的自然数。
根据这个定义的话,我们可以出示第一个比较“想当然”的算法。
1.原始算法
点击(此处)折叠或打开
- bool is_prime_orig(int n)
- {
- for(int i = 2; i <n;i++)
- if( n % i == 0)
- return false;
- return true;
- }
2. 源于平方根的两个算法:
点击(此处)折叠或打开
- bool is_prime_sqrt(int n)
- {
- int root = sqrt(n);/*注意,这里要引用头文件math.h*/
- for(int i =2;i<=root;i++)
- if(n%i==0)
- return false;
- return true;
- }
点击(此处)折叠或打开
- bool is_prime_mult(int n)
- {
- for(int i = 2; i*i <=n;i++)
- if( n % i == 0)
- return false;
- return true;
- }
我们可以根据这个,先判断一个数是否为2,3,5倍数的数,再去运用第二种算法来判断,时间会快很多
3.排除2,3,5倍数算法
点击(此处)折叠或打开
- bool is_prime_excl(int n)
- {
- if(n%2==0||n%3==0||n%5==0)
- return false;
- for(int i = 7; i*i <=n;i++)/*这里要从7开始哈*/
- if( n % i == 0)
- return false;
- return true;
- }
4.筛选算法
点击(此处)折叠或打开
- #define N 1000
- bool is_prime[N+2];
- void filter_primes()
- {
- for(int i = 1; i<=N;i++)
- is_prime[i]=true;
- is_prime[1] = false;
- is_prime[N+1] = true;
- int trav = 2;
- while(trav <= N)
- {
- for(int i=2*trav;i<=N;i=i+trav)
- is_prime[i]=false;
- do{
- trav++;
- }while(!is_prime[trav]);
- }
- }
本文就介绍到这里了,欢迎大家提出宝贵意见。
今后一定勤更新!!!
今后一定勤更新!!!
今后一定勤更新!!!