Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1881106
  • 博文数量: 333
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 4314
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 07:39
文章分类

全部博文(333)

文章存档

2015年(1)

2011年(116)

2010年(187)

2009年(25)

2008年(3)

2007年(1)

分类: C/C++

2010-10-18 11:40:50

一、描述:

从 1到N 如果找到一个数 a是素数,那么将2*a 3*a .....M*a (M*a一直到没有剔除为止:这样剩下的数就都是素数了。 一個大於1的整數,如果除了它本身和1以外,不能被其他正整數所整除,這個整數就叫質數質數也叫素數,如23571113…..都是質數。

如何從正整數中把質數挑出來呢?自然數中有多少質數?人們還不清楚,因為它的規律很難尋找,他像一個頑皮的孩子一樣,東躲西藏,和數學家玩捉迷藏。

1

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

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

 

厄拉多塞篩法

西元前250年,希臘數學家、亞歷山大圖書館館長厄拉多塞(Eeatosthese)想到了一個非常美妙的質數篩法,減少了逐一檢查每個數的的步驟,可以比較簡單的從一大堆數字之中,篩選出質數來,這方法被稱作厄拉多塞篩法(Sieve of Eeatosthese)
以上表為例,2是質數,以2為篩子,留下2並刪去2的倍數;2之後未被刪去的第一個數是3,它是質數。以3為篩子,留下3並刪去3的倍數;3之後未被刪去的第一個數是5,它是質數。以5為篩子,留下5並刪去5的倍數;5之後未被刪去的第一個數是7,它是質數。以7為篩子,留下7並刪去7的倍數;7之後未被刪去的第一個數是11,它是質數。到此就算完成尋找所有介於150之間的質數,因為50的平方根大於7而且小於8,現在表格所剩的數字都是質數。


二、实现


#include <stdio.h>

int Eeatosthese(int N)
{
  int i, j, a[N];

  for (i = 2; i < N; i++) a[i] = 1;
  for (i = 2; i < N; i++)
    if (a[i])
      for (j = i+i; j < N; j += i)
        a[j] = 0;
 

  for (i = 2; i < N; i++)
    if (a[i]) printf("%4d ", i);
  printf("\n");
}


阅读(3701) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

zcsor2017-01-01 12:46:56

楼上没理解是什么意思,

从2开始把3*2,2*3,2*4……都标志为非素数
从3开始把3*2,3*3,3*4……都标志为非素数
…………

所以,判断a[i]是素数标记时才进行内循环。

而博主也有没理解的地方:
1、用2、11测试一下自己的代码看看有什么问题。
2、i<=sqrt(n)。设2m=n则有:(m-k)*(m+k)<m*m。

okoney2013-01-13 23:22:29

for (i = 2; i < N; i++) a = 1;
  for (i = 2; i < N; i++)
    if (a)
      for (j = i+i; j < N; j += i)
        a[j] = 0;
请问上面代码第二行的if条件判断句是不是多余的啊,因为前面不是已经初始化数组元素都为1了么??请教了。。