题目
用埃拉托色尼筛选法求素数,n(<1000)由用户输入。每行输出5个;
原理
首先将0、1排除:
对于初始队列{2,3,4,5,6,7,8,9,10,11,12,13,14……n},操作步骤如下:
(1)输出最小的素数2,然后筛选掉2的倍数,剩下{3,5,7,9,11,13,……}
(2)输出最小的素数3,然后筛选掉3的倍数,剩下{5,7,11,13,……}
(3)输出最小的素数5,然后筛选掉5的倍数,剩下{7,11,13,……}
继续上面步骤,直到队列为空。
代码
#include <stdio.h>
#include <math.h>
int main(){
int prime[1001];
int count=0,n;
printf("请输入一个>2的整数:");
scanf("%d",&n);
for(int i=0;i<=n;i++){
prime[i]=1; //初始化所有的数为素数 因为经过前一次筛选,后面第一个剩下的数一定是素数
}
for(int i=2;i<=sqrt(n);i++){
//从第一个素数2开始筛选
if(prime[i]){
//如果是素数
for(int j=2*i;j<=n;j+=i){
//则剔除掉它的倍数
prime[j]=0;
}
}
}
for(int i=2;i<=n;i++){
if(prime[i]){
count++;
printf("%-4d ",i);
if(count%5==0)putchar('\n');
}
}
printf("count=%d",count);
return 0;
}
运行示例
请输入一个>2的整数:60
2 3 5 7 11
13 17 19 23 29
31 37 41 43 47
53 59 count=17