这是用埃拉托色尼筛选法筛选2~1000的素数的C++程序,能否详细解释一下每个步骤的意思
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这是用埃拉托色尼筛选法筛选2~1000的素数的C++程序,能否详细解释一下每个步骤的意思相关的知识,希望对你有一定的参考价值。
其实题目和解析本身应该是挺清晰了的,估计你是不清楚各个语句的意思,我这里这么写,你看能理解不:
using namespace std; //需要用到的命名空间(标准)
int main() //主方法入口:每个程序必须有且只有一个主方法
int i,j; //定义变量(名字其实可以很随便)
bool prime[2001]; //定义布尔值数组(0到2000是2001个数)
for(i=2;i<2001;++i) //因为0和1都不是素数,所以从2开始
prime[i]=true; //把数组内所有元素赋值为真(即2~2000全是素数)
for(i=2;i<1001;++i) //2~1000逐个数排查(因为最小是2倍,所以到了二分之一之后就没必要检查,因为其2倍必定大于2000
if(prime[i]) //如果还没有被判定为非素数(即题目里的“合数”)
for(j=2;i*j<2001;++j) //从2倍开始,计算出当前数字的所有倍数
prime[i*j]=false; //把当前数字的所有倍数判定为非素数
cout<<"2~2000之内的素数有:"<<endl; //输出结果前的描述和换行
for(i=2;i<2001;++i) //从2开始逐个检查
if(prime[i]) //如果没有判定为非素数
cout<<i<<'\\t'; //输出结果,和制表符(一般是三到四个空格的宽度)
cout<<endl; //输出结果完成,换行
return 0; //因为定义主方法时,定义了其返回整数型值,所以返回一个整数型值
如果还有不明白的问题,请追问。
参考技术A很简单
程序 从2 开始把所有数设置成素数
0 1 2 3 4 5 6 7 8 9 ..........x x T T T T T T T T ..........
// 然后 从2 开始 把 整数倍数(2, 3, 4, 5, 6, 7 ... 倍)设置成 F
x x T T F T F T F T ..........
// 然后查找下一个 T的位置,继续这种操作,这时候 是 3的倍数 (2, 3, 4, 5, 6, 7 ... 倍)
x x T T F T F T F F ..........
// 重复直到最后完成
// 剩下 的 T 全部是 素数。 参考技术B 1.你要知道啥是素数?
倍数只有1和他本身的为素数,1不是素数。
2.埃氏筛选是把有倍数的都去掉就好了。
先把1去掉,
再把1000以内2的倍数去掉,
再把1000以内3的倍数去掉,
……
直到剩下的都是倍数只有1和他本身,
即素数。 参考技术C 看不懂
素数筛选法
筛选法(埃拉托色尼(Eratosthenes)筛法)求素数,例如1~100
思想:逐个筛选,直到int(sqrt(100))个
1)因为1不是质数,将1筛去
2)2是质数,将2的倍数全都挖掉
3)3是质数,将3的倍数全都挖掉
4)4已经被挖去,不进行与4相关的操作
5)5是质数,将5的倍数全都挖掉
6)这个过程一直进行到后面的数全都挖掉为止
不是从1开始:如10~18----一个一个筛--->18
#include <stdio.h> #include <math.h> #include <stdlib.h> //#include <string.h> int isprime(int n) { int i; if(n == 1) return 0; for(i=2;i<(int)sqrt(n);i++) if(n%i == 0) return 0; return 1; } int main() { int n,i,j; scanf("%d",&n); int *num = (int*)malloc(sizeof(int)*(n+1)); //memset(num,0,n+1);//不能将动态开辟的数组数都初始化为0 for(i=1;i<=n;i++) num[i] = 0; //挖数 num[1] = 1; for(i=2;i<=(int)sqrt(n);i++) { if(!num[i]) { if(isprime(i)) { for(j=2*i;j<=n;j++) //挖掉质数的倍数的数 if(j%i == 0) num[j] = 1; } } } for(i=1;i<=n;i++) if(!num[i]) printf("%d ",i); printf("\n"); return 0; }
以上是关于这是用埃拉托色尼筛选法筛选2~1000的素数的C++程序,能否详细解释一下每个步骤的意思的主要内容,如果未能解决你的问题,请参考以下文章