寻找素数
来源:互联网 发布:c语音编程招聘 编辑:程序博客网 时间:2024/05/22 06:24
求小于自然数N的所有素数。
解决方案
程序
经典的素数判定算法是这样:给定一个正整数n,用2到sqrt(n)之间的所有整数去除n,如果可以整除,则n不是素数,如果不可以整除,则n就是素数。所以求小于N的所有素数程序如下:
#include
#include
#define
int
{
算法的时间复杂度是O(N*sqrt(N)),求解规模较小的输入,尚且没有问题。但对于规模较大的N,算法就力不从心了。有一种算法叫厄拉多塞筛(sieve of Eratosthenes),它在求解时具有相当高的效率,但是要牺牲较多的空间。
程序
这个程序的目标是,若i为素数,则设置a[i] = 1;如果不是素数,则设置为0。首先,将所有的数组元素设为1,表示没有已知的非素数。然后将已知为非素数(即为已知素数的倍数)的索引对应的数组元素设置为0。如果将所有较小素数的倍数都设置为0之后,a[i]仍然保持为1,则可判断它是所找的素数。
#include
#include
#define
int
int
{
}
例如,计算小于32的素数,先将所有数组项初始化为1(如下第二列),表示还每发现非素数的数。接下来,将索引为2、3、5倍数的数组项设置成0,因为2、3、5倍数的数是非素数。保持为1的数组项对应索引为素数(如下最右列)。
i
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
如何理解厄拉多塞筛算法呢?
我们一定记得小学时候就学过的素数和合数的性质:任何一个合数一定可以表示成若干个素数之积。如:4 = 2 * 2,6 = 2 * 3,12 = 2 * 2 * 3。也就是说,合数N一定是小于N的某个(或若干)素数的整数倍,反之,如果N不是任何比它小的素数的倍数,则N必然是素数。
程序
经典素数判定算法中,并不需要用2到sqart(n)之间的所有整数去除n,只需要用其间的素数就够了,原因也是合数一定可以表示成若干个素数之积。算法的改进版本如下:
#include
#include
#define
int
int
{
}
算法虽然在效率下,比先前版本有所提高,但需要牺牲空间记住已确定的素数。
程序
程序1-2使用一个数组来包含最简单的元素类型,0和1两个值,如果我们使用位的数组,而不是使用整数的数组,则可获得更高的空间有效性。
#include
#include
#define
#define
#define
#define
#define
void
void
int
int
int
{
}
void
}
void
}
int
- 寻找素数
- 寻找素数
- 寻找素数
- 寻找素数
- 素数寻找
- 寻找素数
- 寻找素数
- 寻找素数 Google题
- C#寻找素数
- 寻找顽强素数 算法
- hdu1262寻找素数对
- 寻找素数对
- hdu1262-寻找素数对
- hdu1262 寻找素数对
- 寻找素数对
- 寻找素数对
- hdoj1262 寻找素数对
- 寻找素数对
- Apache与Nginx的优缺点比较
- phonegap中 app 开发的那些坑~~!!
- hdu 5329 Question for the Leader
- [Github开源库PinterestLikeAdapterView]--Android瀑布流的实现
- 【翻译自mos文章】rman 标准版和企业版的兼容性
- 寻找素数
- 使用GDB调试程序
- 归并排序模板
- 初学JAVA简谈字符串String存储的以及字符串值的比较(==运算符以及equals())
- Web应用的组件化开发
- hdoj-5112-A Curious Matt
- BestCoder 1st Anniversary 1003(HDU5312)
- 多重背包的取模优化
- secureCRT下乱码,同时操作多会话,上传/下载文件,主机间传输文件,创建多级目录