解题思路:构造链表,使用筛除法
例如:求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的素数,就会很慢,本人想可以将大数据分解,使用多线程,这样应该可以的。
时间: 2024-12-18 20:07:37