解题思路:构造链表,使用筛除法
例如:求10以内素数
链表初始化:2 3 4 5 6 7 8 9 10
进行第一轮筛选后:2 3 5 7 9
也就是用2后面的数去除2,
第二轮筛选后:2 3 5 7
也就是用3后面的数去除3,
第三轮筛选后:2 3 5 7
也就是用5后面的数去除5
第四轮筛选后:2 3 5 7
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 1e5 // over this it is so slowly
typedef struct LinkNode {
int data;
struct LinkNode *next;
}LinkNode;
LinkNode *head;
void Init() {
LinkNode *p, *r;
int i;
head = (LinkNode *)malloc(sizeof(LinkNode));
if(!head) exit(1); // this is nearly impossible
head->next = 0;
r = head;
for(i = 2;i <= N;i++) {
p = (LinkNode *)malloc(sizeof(LinkNode));
if(!p) exit(1);
p->data = i;
p->next = 0;
r->next = p;
r = p;
}
}
void Prime() {
int cnt = 0;
int i =0;
LinkNode *p, *q, *pre, *r;
p = head->next;
while(p) {
q = p->next;
pre = p;
while(q) {
if(q->data % p->data == 0) { // delete this node
pre->next = q->next;
r = q;
q = pre->next;
free(r);
}
else {
pre = q;
q = q->next;
}
}
p = p->next;
}
/*
* print the prime
* */
for(p = head->next;p;p = p->next) {
cnt++;
i++;
if(i % 10 == 0) {
printf("\n");
i = 0;
}
printf("%d\t", p->data);
}
printf("\nthere are %d primes\n", cnt);
}
int main() {
Init();
Prime();
return 0;
}
此算法还是不能解决大量素数情况,如果超过1e5的素数,就会很慢,本人想可以将大数据分解,使用多线程,这样应该可以的。