试探究一种查找素数算法

来源:互联网 发布:哥德尔和人工智能 编辑:程序博客网 时间:2024/06/18 13:37

解题思路:构造链表,使用筛除法

例如:求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 slowlytypedef 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 impossiblehead->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 nodepre->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的素数,就会很慢,本人想可以将大数据分解,使用多线程,这样应该可以的。

0 0