这道题看到一眼就能想到一个for循环,对每个数取余,如果==0,说明能除断,就不是素数(质数)。
1、如果用上面的方法去做,当n小的时候,没什么,当n数据大的时候,效率就是一个问题,做了很多无用判断。
改进:
1、所有的偶数都不是素数(质数),所以不用对偶数进行判断取余。
2、第一个可能想到,大于该数1/2的数都不能整除,(例如:该数100除以50(不包括50)之后的数都不可能整除)
但是,经规律实验证明 ,大于该数的二次根的数都不能整除。
#include<stdio.h>
#include<malloc.h>
#include<math.h>
#include<assert.h>
void SiftPrime(int n)
{
int *pArr = (int *)malloc(n*sizeof(n)); /* 动态申请n个整型空间*/
int i;
int j;
assert(pArr != NULL);
for(i=0; i<n; i++) /* 初始化数组 */
{
pArr[i] = i;
}
pArr[1] = pArr[0] = 0; /* 0和1不是素数 */
for(i=2; i<=sqrt(1.0*n); i++)
{
for(j=i+1; j<n; j+