这篇文章主要为大家介绍一个算法,素数筛法。
想必小伙伴们大家最常用的算法就是很常规的素数算法。在下面给出代码。
//C++实现,如果有人不会C实现的版本请联系我,我写完给你看
//如果有小伙伴不理解代码请留言
/// 以下是求单个素数版本
//功能:输入num判断num是否为素数
#include<iostream>
#include<math.h> //这个是用于后面的sqrt()函数
using namespace std;
/// 单个素数怎么判定的算法,如果正确就返回1
int IsPrime(int num){
int i;
for(i=2;i<sqrt(num);i++) //数学上证明了只需要到sqrt就可以了
{
if(num%i==0){
return 0;
}
}
return 1;
}
void main()
{
int num;
cin>>num; //cin相当于C语言中的scanf
if(IsPrime(num)){
cout<<"该数是素数"<<endl; //cout相当于C语言中的printf
}
else
cout<<"该数不是素数"<<endl;
}
/ 以下是求一段区间的素数代码
//功能:输出0到N-1之间的素数
#include <iostream>
using namespace std;
#define N 100
int IsPrime(int num){
int i;
for(i=2;i<sqrt(num);i++) //数学上证明了只需要到sqrt就可以了
{
if(num%i==0){
return 0;
}
}
return 1;
}
void main()
{
int i;
for(i=0;i<N;i++){
if(IsPrime(i)){
cout<<i<<"是素数"<<" "<<endl; //输出素数
// 如果上一行加入一个count能够计算0到N-1的素数个数
}
}
}
下面是高效率的素数筛法
// 思路:1,在0到N-1 之间设置bool数组,bool数组 每一个元素放着正确或者是错误的判断,你可以认为放着的要么是1 ,要么是 0,;1代表正确true,0代表错误 false。
2,在0到N做第一次判断,如果该数不为偶数,则bool数组该位置放true,为偶数就为false
3,找到第二步中true的矩阵,他们的倍数肯定不是素数,因此置为false;
4,对0到N-1做一次遍历,放true的矩阵的下标值就是素数.
代码功能:
找到0到N-1之间的素数并输出,高效率版本
#include <iostream>
#include <math.h>
using namespace std;
#define N 100
bool matrix[N];
void main()
{
for(int i=3;i<N;i++){ //对应的第二步
if(i%2){
matrix[i] =true;
}
else
matrix[i] =false;
}
for(i=3;i<N;i++){ //对应的第三步
if(matrix[i]){
for(int j=i*2;j<N;j+=i){
//找到true矩阵倍数并置false
matrix[j] = false;
}
}
}
for(i=3;i<N;i++){
if(matrix[i]==true){
cout<<matrix[i]<<" ";
}
}
}
总结:以上就是代码。在上面代码宏定义中的N
如果N不够大,两个算法是没有多大区别的,但是!如果N到了1000000的级别,普通素数筛法会花很久的时间,而素数筛法实现的数据只需要花很短的时间就能跑出结果,这是相当重要的!
附上算跑程序时间的源码:
#include <iostream>
#include <time.h> //算时间的函数在这个头文件里面
#include <math.h>
using namespace std;
#define N 100
bool matrix[N];
void main()
{
clock_t start,end;
start =clock();
for(int i=3;i<N;i++){ //对应的第二步
if(i%2){
matrix[i] =true;
}
else
matrix[i] =false;
}
for(i=3;i<N;i++){ //对应的第三步
if(matrix[i]){
for(int j=i*2;j<N;j+=i){
//找到true矩阵倍数并置false
matrix[j] = false;
}
}
}
for(i=3;i<N;i++){
if(matrix[i]==true){
cout<<matrix[i]<<" ";
}
}
end = clock();
cout<<"跑程序花了"<<end-start<<"毫秒"<<endl;
}
小技巧:
如何粘贴CSDN的代码并去掉行号加小数点?
1,下载notepad++软件,拷贝CSDN的代码进去。
2,按住alt键就可以进行选中竖直方向的数字加小数点 ,删除即可。
seen
2015-08-07