埃拉托色尼筛法用于求一定范围内的素数。
第一种方法:
原理是在数组元素中存放数值,若判定为非素数则将其值修改为0,输出时会跳过值为0的元素。
- //埃拉托色尼筛法
- #include <iostream>
- #include <iomanip>
- #define NUM 100
- #define W 2
- using namespace std;
- int main(int argc,char * argv[])
- {
- int array[NUM/2];
- int sign,flag;
- //给数组赋值
- for(sign=0,flag=3;sign<NUM/2-1;sign++)
- {
- array[sign]=flag;
- flag+=2;
- }
- //对数组进行筛选
- for(sign=0;sign<NUM/2-1;sign++)
- {
- if(array[sign])
- {
- for(flag=sign+1;flag<49;flag++)
- {
- if(!(array[flag]%array[sign]))
- {
- array[flag]=0;
- }
- }
- }
- }
- //输出素数组
- cout<<"100以内的素数有:\n 2\t";
- flag=1;
- for(sign=0;sign<NUM/2-1;sign++)
- {
- if(array[sign])
- {
- cout<<setw(W)<<array[sign]<<'\t';
- flag+=1;
- if(!(flag%5))
- {
- cout<<endl;
- }
- }
- }
- cout<<endl;
- return 0;
- }
代码中会反复出现 NUM/2-1 的原因:
if sign<=50 最后判断的数字为 3+2*50=103 超出了上限100
if sign<=49 最后判断的数字为 3+2*49=101 超出了上限100
if sign<49(即sign<=48) 最后判断的数字为 3+2*48=99 在范围之内
至于为什么是 NUM/2-1 ,在原理上想不通怎么解释,只是在运行过程中观察结果得出的结论。
另一种方法:
用数组的下标存放数值,数组中各元素的值用0和1表示是不是素数。最终输出值为1的数组元素的下标。
原理是,发现一个数,然后在后面的所有数中删除它的倍数(赋值为0)。
- //埃拉托色尼筛法
- #include <iostream>
- #include <iomanip>
- #define N 100
- #define W 2
- using namespace std;
- int main(int argc,char *argv[])
- {
- int array[N]={0},sign,flag,i=0;
- cout<<N<<"以内的素数有:"<<endl;
- for(sign=2;sign<N;sign++)
- {
- if(array[sign]==0)
- {
- cout<<setw(W)<<sign<<" ";
- i++;
- //每输出5个值后换行
- if(i%5==0)
- {
- cout<<endl;
- }
- }
- for(flag=1;sign*flag<=N;flag++)
- {
- array[sign*flag]=1;
- }
- }
- return 0;
- }
转载于:https://blog.51cto.com/wenryxu/1173267