1.算法思路:
素数筛法是这样的:
1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false.
2.然后:
for( i=3; i<=sqrt(n); i+=2 )
{ if(prime)
for( j=i+i; j<=n; j+=i )
prime[j]=false;
}
3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。
原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质
数的倍数筛掉。
一个简单的筛素数的过程:n=30。
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
第 1 步过后2 4 ... 28 30这15个单元被标成false,其余为true。
第 2 步开始:
i=3; 由于prime[3]=true, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]标为false.
i=4; 由于prime[4]=false,不在继续筛法步骤。
i=5; 由于prime[5]=true, 把prime[10],[15],[20],[25],[30]标为false.
i=6>sqrt(30)算法结束。
第 3 步把prime[]值为true的下标输出来:
for(i=2; i<=30; i++)
if(prime) printf("%d ",i);
结果是 2 3 5 7 11 13 17 19 23 29
2例题:
南洋理工acm 187
快速查找素数
-
描述
-
现在给你一个正整数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
-
给出一个正整数数N(N<=2000000)
3代码:
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
bool a[2000001];
int main()
{
int n;
for(int i = 0; i < 2000001; i++)
{
if(i % 2 == 0)
a[i] = false;
else
a[i] = true;
}
for(int i = 2; i < 2000001; i++)
{
if(a[i])
{
for(int j = i + i; j < 2000001; j += i)
a[j] = false;
}
}
while(scanf("%d",&n) != EOF)
{
if(n == 0)
break;
printf("2");
for(int i = 3; i <= n; i++)
{
if(a[i])
printf(" %d",i);
}
cout<<endl;
}
return 0;
}
4.java小例子
验证哥德巴赫猜想:>=6的偶数能够表示成两个素数之和
public class Main
{
public static boolean a[] = new boolean[200000];
public static void main(String args[])
{
a[0] = false;
a[1] = false;
a[2] = true;
for(int i = 3; i < 200000; i++)
{
if(i % 2 == 0)
a[i] = false;
else
a[i] = true;
}
for(int i = 3; i <= Math.sqrt(200000); i+= 2)
{
if(a[i] == true)
{
for(int j = i + i; j < 200000; j = j + i)
{
a[j] = false;
}
}
}
/*for(int i = 0; i < 100; i++)
{
if(a[i] == true)
System.out.print(i + " ");
}*/
for(int i = 6; i < 200000; i += 2)
{
for(int j = 2; j < i; j++)
{
if(a[j] == true && a[i-j] == true)
{
System.out.println("偶数" + i + "是素数" + j + "和素数" + (i - j) + "之和");
break;
}
}
}
}
}