HDU 2012 素数判断方式
生活随笔
收集整理的這篇文章主要介紹了
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]){ //首位素數為falseprime[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])iprime[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 2600bool 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; }?
轉載于:https://www.cnblogs.com/Elvis827/p/9119791.html
總結
以上是生活随笔為你收集整理的HDU 2012 素数判断方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue+Mock.js模拟登录和表格的增
- 下一篇: WCF双工通信笔记