HDU 2012 素数判断方式
复习了一下素数 埃氏筛 线性筛
埃氏筛和线性筛可以优先筛选出素数,从而节省时间哦
线性筛应该挺好理解的
埃氏筛就是i%prime[j] 这里可能不太好理解 可以举几下例子 就会慢慢懂的
举了例子 下次再看 脑海里就会自动浮现当初举的例子啦。
// 基础判断素数 bool prime(long long p){ for(int i=2; i * i < p; i++){ if(p % i == 0) return true; } return false; }
// 线性筛 void findprime(){ for(int i = 2; i <= 1000 ; i++){ if(!isnotprime[i]){ //首位素数为false prime[primeCount++] = i; for(int j = 2 * i; j <= 1000; j += i) isnotprime[j] = true; //非素数标记true不再进入循环 } } }
// 埃氏筛 void findprime(){ for(long i = 2; i < max; i++){ if(!isnotprime[i])i prime[primeCount++] = i; for(long j = 0; j < primeCount && i * prime[j] < max; j++) //用i*prime[j]来表示素数的所有倍数,j从0开始,prime从首个素数开始计算,另外i*prime[j]不能大于max{ isnotprime[i * prime[j]] = 1; if(!(i % prime[j])) //只要首个倍数已经会被某个素数整除,那么比他还要大的相应的倍数自然也不是素数,直接break掉,不再计算比他要大的相应的倍数,时间减少 break; } }
//http://acm.hdu.edu.cn/showproblem.php?pid=2012 #include <stdio.h> #define max 2600 bool isNotPrime[max]; int primeCount = 0; int prime[max]; void findPrime(){ for(int i = 2; i < max; i ++){ if(!isNotPrime[i]){ prime[primeCount++] = i; } for(int j = 0; j < primeCount && i * prime[j] < max; j ++){ isNotPrime[i * prime[j]] = true; if(!(i % prime[j])) break; } } } int main(){ int x, y, z; findPrime(); while(scanf("%d%d", &x, &y) != EOF){ if(x == 0 && y == 0) break; int i; for(i = x; i <= y; i ++){ z = i * i + i + 41; if(!isNotPrime[z]) continue; else break; } if(i == y + 1) printf("OK\n"); else printf("Sorry\n"); } return 0; }