|
20鱼币
在网上找一个快速筛选素数的方法,但是看不懂
若x≧1且n=6x-1或n=6x+1不是素数,那么n一定不是2和3的倍数。
证明:
∵n=6x-1或n=6x+1,即n=2(3x)-1或n=2(3x)+1或n=3(2x)-1或n=3(2x)+1。
∴n一定不是2和3的倍数。
将筛选法进行改进,只判断6x两侧的数。
原代码
- #define N 100000000
- bool notPrime[N+5];
- void ScreeningPrime(void)
- {
- int i, j, increment[6] = {0, 4, 0, 0, 0, 2};
- for (i = 5; i*i <= N; i += increment[i%6])
- {
- for (j = i; i*j <= N; j += increment[j%6])
- {
- notPrime[i*j] = true;
- }
- }
- }
复制代码
谁可以给我解释解释,看不懂,并且我直套用也不行
- # include<iostream>
- #define N 100000000
- bool notPrime[N+5];
- int main()
- {
- int i, j, increment[6] = {0, 4, 0, 0, 0, 2};
- for (i = 5; i*i <= N; i += increment[i%6])
- {
- for (j = i; i*j <= N; j += increment[j%6])
- {
- notPrime[i*j] = true;
- }
- }
- for(i=5;i<=100;i++) //好像根本没有筛选,都输出了
- {
- if(!notPrime[i])
- printf("%d\n",i);
- }
- }
复制代码
- #include <stdio.h>
- #define N 1000
- int yesPrime[N];
- void ScreeningPrime();
- int main()
- {
- int i;
- ScreeningPrime();
- for (i = 5; i < 100; i++)
- {
- printf("%d is :%d\n", i, yesPrime[i]);
- }
- return 0;
- }
- void ScreeningPrime(void)
- {
- int i, increment[6] = { 0, 4, 0, 0, 0, 2 };
- for (i = 5; i < N; i += increment[i % 6])
- {
- yesPrime[i] = 1;
- }
- }
复制代码
我改了一下,
你看下能不能看懂
注:算法有问题,有一些不是素数的也混进来了
25 能混进来是因为 5 没有算进去
49 能混进来是为什么?
|
最佳答案
查看完整内容
我改了一下,
你看下能不能看懂
注:算法有问题,有一些不是素数的也混进来了
25 能混进来是因为 5 没有算进去
49 能混进来是为什么?
|