题目:输出n以内的全部素数
方法一:
判断一个数n是不是素数,可以用2到之间的所有整数去除n,看能否整除。若都不能整除,那么n是素数。(较慢)
方法2:筛法求素数:
原理:
把2到n中所有数列出来,
然后从2开始,先划掉n内所有2的倍数,(//剩2 3 5 7 9)
然后每次从下一个剩下的数(必然是素数)开始,划掉其n内所有的倍数(//划掉3的倍数,剩2 3 5 7;接着依次划掉5、7、9的倍数,剩2 3 5 7为所求)。
从方法1到方法2,空间换时间,加快了计算速度。
程序思路:
设置一个标志数组 isPrime, isPOrinme[i] 的值若是1就表示i是素数
划掉k的倍数,就是把 isPrime[2*k],isPrime[3*k]...置成0
最后检查 isPrime 数组,输出 isPrime[i]为1的那些 i。
#include<iostream>
using namespace std;
#define NUM 10000000//使用符号常量,便于修改
char isPrime[NUM+1];//一个int类型变量占4个字节,用来存放1/0过于浪费。一个char类型的变只占1个字节
int main()
{
for(int i=2;i<=NUM;i++) {//i为要筛的2到100000的数,开始假设所有数都是素数
isPrime[i]=1;
}
for(int i=2;i<=NUM;i++) {
if(isPrime[i]) {//若为1,就是素数。如果为0,表示之前已经被筛掉过了,不用再筛了
for(int j=2*i;j<=NUM;j=j+i) {//找出其在NUM以内的倍数
isPrime[j]=0;//并置为0,表示非素数
}
}
}
for(int i=2;i<=NUM;i++) {
if(isPrime[i])
cout<<i<<" ";
}
return 0;
}