筛选法(埃拉托色尼(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; }
时间: 2024-12-29 23:31:44