程序代码:
/* 用筛法查找某个整数区间内素数并保存在数组内 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define LEN (y-x+1)
int cur = 0;
int * numlist(int x, int y);
int * filter(int * p, int len);
int * newnum(int *p, int len);
int main(void) {
int i, x, y, *pnum = NULL;
printf("查找某个整数区间内素数 (下限 上限) : ");
scanf("%d%d", &x, &y);
pnum = newnum(filter(numlist(x, y), LEN), LEN);
printf("下限: %d\n上限: %d\n区间内的素数:\n", x, y);
for(i = 0; i < cur; i++) {
printf("%d ", *(pnum + i));
}
printf("\n");
free(pnum);
return 0;
}
int * numlist(int x, int y) {
int i = 0, *p = NULL, len = ((y - x) >= 0 && x >= 2 && y >= 2) ? LEN : 0;
if(len != 0) {
p = malloc(len * sizeof(int));
} else {
return NULL;
}
if(p == NULL) {
printf("*内存分配错误!");
return NULL;
} else {
for(; i < len; i ++) {
*(p + i) = x + i;
}
}
return p;
}
int * filter(int * p, int len) {
int i, j, k;
for(i = 0; i < len; i++) {
if(*(p + i) != 0) {
for(j = 2; j <= sqrt(*(p + i)); k = 0, j++) {
if(*(p + i) % j == 0) {
while(k * j <= sqrt(*(p + i))) {
*(p + i + j * k) = 0;
k++;
}
*(p + i) = 0;
}
}
}
}
return p;
}
int * newnum(int *p, int len) {
int i, j = 0, *pnew = NULL;
for(i = 0; i < len; i++) {
if(*(p + i) != 0) {
cur++;
}
}
pnew = malloc(cur * sizeof(int));
if(pnew != NULL) {
for(i = 0; i < len; i++) {
if(*(p + i) != 0) {
*(pnew + j) = *(p + i);
j++;
}
}
} else {
printf("**内存分配错误!\n");
return NULL;
}
return pnew;
}