`
java-mans
  • 浏览: 11435880 次
文章分类
社区版块
存档分类
最新评论

素数专题

 
阅读更多
#include <iostream>
#include <cmath>

using namespace std;
const int nMax = 10000000;
int isPrime[nMax];
int prime[nMax];
int factor[nMax];
int len;


void f1()//朴素筛选
{
	int n;//求[1, n]之间的素数
	scanf("%d", &n);
	len = 0;
	memset(isPrime, 0, sizeof(isPrime));
	isPrime[0] = isPrime[1] = 1;
	int i;
	for(i = 2; i <= n; ++ i)
	{
		if(!isPrime[i])
		{
			prime[len ++] = i;
			isPrime[i] = 1;
			__int64 j;
			for(j = (__int64)i * i; j <= n; j += i)//这里i * i会越界
				isPrime[j] = 1;
		}
	}
}

void f2()//线性筛选。在f1上进行改装,每次查找合数时,使用该合数的最小质因子寻找。速度可提高2倍,但是我感觉不太出来
{
	int n;//求[1, n]之间的素数
	scanf("%d", &n);
	len = 0;
	memset(isPrime, 0, sizeof(isPrime));
	isPrime[0] = isPrime[1] = 1;
	int i;
	for(i = 2; i <= n; ++ i)
	{
		if(!isPrime[i])
			prime[len ++] = i;
		int j;
		for(j = 0; j < len && i * prime[j] <= n; ++ j)
			//每次更新一个i,则对所有素数遍历一次。如果发现i是其中素数的倍数,则跳出循环,这样避免重复运算
		{
			isPrime[i * prime[j]] = 1;
			if(i % prime[j] == 0)
				break;
		}
	}
}

int max(int a, int b)
{
	return a > b ? a : b;
}

void f3()//区间内求素数,两点,第一:两数相乘筛选出所有的合数。第二:使用移动数组做标记
{
	int a, b;//求区间[a,b]之间的所有素数
	scanf("%d%d", &a, &b);
	if(a == 1) a ++;//1的时候需要特殊判断,因为永远标记不到
	int m = sqrt(b + 0.5);
	int i;
	for(i = 2; i <= m; ++ i)
	{
		int j;
		for(j = max(i, a / i); j <= b / i; ++ j)
			if(i * j - a >= 0)
				isPrime[i * j - a] = 1;
	}
	len = 0;
	for(i = a; i <= b; ++ i)
		if(!isPrime[i - a])
			prime[len ++] = i;

}

void f4()//最小质因数,函数与f2()很相似
{
	int n;//求[1,n]所有数的质因数
	scanf("%d", &n);
	memset(isPrime, 0, sizeof(isPrime));
	len = 0;
	int i;
	factor[1] = 1;
	for(i = 2; i <= n; ++ i)
	{
		if(!isPrime[i])
		{
			prime[len ++] = i;
			factor[i] = i;
		}
		int j;
		for(j = 0; j < len && i * prime[j] <= n; ++ j)
		{
			isPrime[i * prime[j]] = 1;
			factor[i * prime[j]] = prime[j];
			if(i % prime[j] == 0)
				break;
		}
	}
	for(i = 1; i <= n; ++ i)
	{
		printf("i = %d, factor = %d\n", i, factor[i]);
	}
}

void print()
{
	int i;
	for(i = 0; i < len; ++ i)
	{
		printf("%d\t", prime[i]);
		if((i + 1) % 5 == 0)
			printf("\n");
	}
	printf("\n");
}

int main()
{
	/*
	f1();
	print();
	f2();
	print();
	f3();
	print();*/
	f4();
	return 0;
}

参见:

http://hi.baidu.com/czyuan_acm/blog/item/8a6f7d88187acd9fa4c2721f.html

http://hi.baidu.com/czyuan_acm/blog/item/444a9fa8cecdd9bacb130c2c.html

分享到:
评论

相关推荐

    小升初数学专题1:数与代数(2)数的整除、因数、倍数、合数、质数、奇数、偶数.pdf

    小升初数学专题1:数与代数(2)数的整除、因数、倍数、合数、质数、奇数、偶数.pdf

    五年级奥数专题03:质数及合数.doc

    五年级奥数专题03:质数及合数.doc

    java实验报告(总)

    专题二 5 函数调用:素数问题 7 专题二 6 switch 8 专题二 7控制结构 9 专题二 8 数组排序 10 专题二 9合并数组 11 专题二 10 彩票程序 实践二 2.3 13 专题 三1 Box 课后题8 14 专题 三2 Point类 课后题9 15 专题 三...

    超详细入门到精通自学视频课程阶段01JavaSE基础02 编程思维课-编程思维和编程能力综合应用专题课03案例2:找素数.mp4

    Java是一种编程语言,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的“形式和感觉”,但它要比C++语言更易于使用,而且在编程时彻底采用了一种“以对象为导向”的方式。 使用Java编写的应用程序,既...

    leetcode递归专题-Pursuit-Core-iOS-DSA-Practice:SwiftDSA练习

    递归专题追求-核心-iOS-DSA-实践 Swift 数据结构和算法以及练习。 周 第 1 周:大 O 表示法、递归、排序概述、ADT 概述、DSA 评估 #1 第 2 周:字符串、数组 第 3 周:字典、集合、节点、链表、堆栈、队列 第 4 周:...

    2009年Java认证考试重点指导

    [学习资料] 09年Java认证考试:JAVA求素数算法实现 [学习资料] 09年Java认证考试:java类的构造方法 [学习资料] 09年Java认证考试:Java软件开发中可能出现几个错误观点 [学习资料] 09年Java认证考试:Java开发工具及...

    leetcode卡-leetcode:leetcode练习

    leetcode卡 leetcode 数组专题 从排序数组中删除重复项 买卖股票的最佳时机 II (贪心) 旋转数组 ...计数质数 罗马数字转整数 其他 有效的括号 缺失数字 帕斯卡三角形 位1的个数 颠倒二进制位 汉明距离

    有限单群的一些数量性质

    针对文献中关于素图分类存在的问题,利用单群的孤立点集对其进行了修正,并对原...同时,还得到一个有趣的数量结果,即阶能被素数p整除的最小的非交换单群是Al t5或A1(p)。这些成果丰富了有限群的数量刻画这一专题内容。

    ACM-ICPC要求的知识点

    ACM-ICPC要求的知识点 ...数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余方程,中国剩余定理) 指针(链表,搜索判重,邻接表,开散列,二叉树的表示,多叉树的表示)

    ACM 内部预定函数

    7.判断一个数是否素数 8.求子距阵最大和 9.求一个数每一位之和 10.质因数分解 11.高斯消元法解线性方程组 图论: 1.Prim算法求最小生成树 2.Dijkstra算法求单源最短路径 3.Bellman-ford算法求单源最短...

    新高一分班考试必背知识点(数学):第03讲 数论专题必背考点

    整除的基本性质 1已知则特别地若则有 2已知则 唯一分解定理任何一个大于1的自然数都可以写成质数的连乘积即 其中为质数为自然数并且这种表示是唯一的 该式称为的质因数分解式 约数个数定理设自然数的质因

    Python实现的调用C语言函数功能简单实例

    本文实例讲述了Python实现的调用C语言函数功能。分享给大家供大家参考,具体如下: ...更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、

    上海交通大学ACM算法模板

    专题讨论 1. 树状数组 2. 字典树 3. 后缀树 4. 线段树 5. 并查集 6. 二叉堆 7. 逆序数(归并排序) 8. 树状DP 9. 欧拉路 10. 八数码 11. 高斯消元法 12. 字符串匹配(KMP算法) 13. 全排列,全组合 14. 二维线段树 15. ...

    ACM 算法模板集

    专题讨论 1. 树状数组 2. 字典树 3. 后缀树 4. 线段树 5. 并查集 6. 二叉堆 7. 逆序数(归并排序) 8. 树状DP 9. 欧拉路 10. 八数码 11. 高斯消元法 12. 字符串匹配(KMP算法) 13. 全排列,全组合 14. 二维线段树 15. ...

    算法导论(part1)

    对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算法的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算法的作用、概率分析和随机化算法、线性...

    算法导论(part2)

    对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算法的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算法的作用、概率分析和随机化算法、线性...

Global site tag (gtag.js) - Google Analytics