试探究一种查找素数算法

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

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

试探究一种查找素数算法,布布扣,bubuko.com

时间: 2024-12-18 20:07:37

试探究一种查找素数算法的相关文章

目前流行的几种排课算法的介绍

通用高校排课算法研究----2 .目前流行的几种排课算法的介绍 2   目前流行的几种排课算法的介绍 2.1. 自动排课算法 1 .问题的描述 我们讨论的自动排课问题的简化描述如下: 设要安排的课程为{ C1 , C2 , ., Cn} ,课程总数为n , 而各门课程每周安排次数(每次为连续的2 学时) 为{ N1 , N2 , ., Nn} ;每周教学日共5 天,即星期一- 星期五;每个教学日最多安排4次课程教学,即1 - 2 节.3 - 4 节.5 - 6 节和7 - 8 节(以下分别称第1

一个关于汉字查找的算法的猜想

有没有想过当你按下ctrl+F的时候程序是怎样做到查找你要查找的内容,例如在这篇文章里查询"程序设计"我的猜想是它首先会查找到所有有"程"字的词语,将下标存在一个数组里,在查找,直到把这片文章查完,然后再在含有"序"字的地方,过程同上,然后查"设"字,然后再查"计",这用递归应该比较合适,因为操作都是相似的,有限步之内能完成的.所以可以递归,现在就是要设计出程序,加油. 就在刚才想到了另一种办法,就是当查到

几种常用hash算法及原理

计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人 类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来:而当给定结果的时候,很难计算出输入来,这就是单项函数.各种加密函 数都可以被认为是单向函数的逼近.Hash函数(或者成为散列函数)也可以看成是单向函数的一个逼近.即它接近于满足单向函数的定义. Hash函数还有另外的含义.实际中的Hash函数是指把一个大范围映射到一个小范围.把大

眼下流行的几种排课算法的介绍

通用高校排课算法研究----2 .眼下流行的几种排课算法的介绍 2眼下流行的几种排课算法的介绍 2.1. 自己主动排课算法 1 .问题的描写叙述 我们讨论的自己主动排课问题的简化描写叙述例如以下: 设要安排的课程为{ C1 , C2 , ., Cn} ,课程总数为n , 而各门课程每周安排次数(每次为连续的2 学时) 为{ N1 , N2 , ., Nn} ;每周教学日共5 天,即星期一- 星期五;每一个教学日最多安排4 次课程教学,即1 - 2 节.3 - 4 节.5 - 6 节和7 - 8

五种常用的算法设计技巧之二:分治算法

一,介绍 分治算法主要包含两个步骤:分.治.分,就是递归地将原问题分解成小问题:治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式 分治算法一般都可以写出一个递归表达式:比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N) T(N)代表整个原问题,采用了分治解决方案后,它可以表示成: ①分解成了两个规模只有原来一半(N/2)的子问题:T(N/2) ②当解决完这两个子问题T(N/2)之后,再合并这两个子问题需要的代价是 O(N) 递

高速查找素数

高速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 如今给你一个正整数N,要你高速的找出在2.....N这些数里面全部的素数. 输入 给出一个正整数数N(N<=2000000) 但N为0时结束程序. 測试数据不超过100组 输出 将2~N范围内全部的素数输出.两个数之间用空格隔开 例子输入 5 10 11 0 例子输出 2 3 5 2 3 5 7 2 3 5 7 11 来源 经典题 上传者 路过这 素数打表.提交開始超时.改成c语言的就过了 #incl

JavaScript版几种常见排序算法

今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * 冒泡排序:最简单,也最慢,貌似长度小于7最优* 插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势* 快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合* 希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快* 系统方法:在forfox下系

8种主要排序算法的C#实现

新的一年到了,很多园友都辞职要去追求更好的工作环境,我也是其中一个,呵呵! 最近闲暇的时候我开始重温一些常用的算法.老早就买了<算法导论>,一直都没啃下去. 这本书确实很好,只是太难读了,总是读了几章就又读不下去了!工作上也几乎用不到. 我这段时间发现看这些排序算法比以前容易了很多,就借此机会将它们整理总结起来. 一是方便以后重温,二是可以应对笔试面试.同时也希望这篇博文可以帮助各位刚辞职和正在学习排序算法的园友. PS:有可能实现的代码并不是最优的,如果有什么错误或者值得改进的地方,还请大家

素数算法的优化之路

一.素数的定义 质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数(不包括0)整除的数.因为合数是由若干个质数相乘而得来的,所以,没有质数就没有合数,由此可见质数在数论中有着很重要的地位. 比如:2,3,5,7,9.....都是素数. 二.构造素数算法 写算法之前,先来说说以下这个东西: 对于任意一个合数n,如果它有两个质因子x,y,显然n = x*y, 所以,由不等式性质可得,x <= sqrt(n), 即 x <= n^(1/2). 推广一下,对于任意一个合数,