我们都知道求一个数是不是素数的方法是十分简单的,但是当你判断一个数字集合里面都有哪些素数的时候,纯暴力法就会显得效率十分低下,这时候就需要用技巧筛掉明显不是素数的数字,剩下的再采用暴力直接求解,那么那些明显不是素数呢?首先偶数全不是素数,其次一个素数的倍数也不是素数,那么筛掉这两种情况剩余的一定是素数(反证法可证明),程序如下:
1 int min,max; 2 int t; 3 int i,j,k; 4 int flag[10000] = {0}; 5 int num[10000]; 6 num[2] = 1; 7 num[1] = 0; 8 printf("请输入数字的区间范围:"); 9 scanf("%d,%d",&min,&max); 10 if(min > max) 11 { 12 t =min; 13 min = max; 14 max = t; 15 } 16 //4以后的偶数全不是素数 17 for(i = 4; i<= max; i+=2) 18 { 19 flag[i] = 1; 20 } 21 //从3开始计算 22 for(i = 3 ;i <= max;i++) 23 { 24 if(flag[i]) 25 { 26 num[i] = num[i - 1]; 27 continue; 28 } 29 else 30 { 31 num[i] = num[i - 1] + 1; 32 //素数的倍数全不是素数 33 for(k = i ; k <= max; k+=i) 34 { 35 flag[k] = 1; 36 } 37 } 38 } 39 printf("在%d到%d之间,一共有%d个素数",min,max,num[max] - num[min]); 40 system("pause"); 41 return 0;