篩選法
求出n以內的素數,最快的應該是篩選法。
篩選法的思路是:
要求10000以內的素數,把1-10000都列出來,1不是素數,劃掉;2是素數,所有2的倍數都不是素數,劃掉;取出下乙個倖存的數,劃掉它的所有倍數;直到所有素數找完為止。
這種做法的空間複雜度是o(n),時間複雜度o(n/logn)。
const int max = 1000005;
bool prime[max]=;//0表示素數,1為非素數
//篩選n以內的素數
void getprime(int n)
}}
分解素因子
唯一質因子分解定理:任意乙個合數a僅能以一種方式,寫成如下的乘積形式:
a = p1^e1*p2^e2*...*pr^er
其中pi為素數,p1
素因子的分解技巧:首先a的某兩個素因子不可能同時大於sqrt(a),這樣,先用篩選法求出sqrt(a)以內的所有素數,然後用a依次去mod這些素數,若能整除,則找到素因子,將素因子去掉,再繼續找。最後若a>1,則a也是它的素因子。
const int max = 100005;
int isprime[max]=;
int prime[max/5],num=0;
int factors[100],s=0;
void getprime(int n)
}}void decompose(int n, int* factors)
例
poj2262
題意:給出任意乙個正整數n(n<=10^6),根據哥德**猜想:任意乙個不小於6的整數,都可以表示為兩個奇素數之和。問雖任意整數是否滿足這個猜想。
解:篩選法將n以內的所有素數都求出來,若a是素數,判斷n-a是否為素數,若找到一組不滿足,則答案為否定。
poj1142
題意:給乙個數n(n<=10^7),求最小的m>n,使得m的素因子每一位上的數的和 == m的每一位上的數的和。
解:顯然這題就是要分解素因子。先求10^4以內的素數,再用素因子分解,然後判斷。
#include #include #include #include using namespace std;
const int max = 10005;
bool isprime[max]=;
int prime[max/4],num=0;
void getprime(int n)
}}int getsum(int n)
return ret;
}bool issmith(int n)
int main()
printf("%d\n",i);
}return 0;
}
素數判斷與素數篩選法
方法一 直接判斷,思想簡單,實現比較簡單,但是複雜度過高bool isprime int a return true 方法二 素數篩選法 eratosthenes 篩法 只有素數才能當篩子 篩掉對應的倍數,不超過要求的範圍即可 遍歷一遍 void getprime int n 從i i開始計算 j ...
(基本數論)素數篩選與判斷
這種方法就是將給出的數判斷能否找到處1以及它本身以外的因數。樣例 include using namespace std bool f int n return 1 int main 埃氏篩法就是從2開始篩掉2的倍數 必須從2倍開始 往下依次進行。樣例 include using namespace...
素數篩選法與點燈案例
1.介紹 假設所有待判斷的數字的上限是l,宣告乙個長度為l 1的布林陣列a l 1 用這個陣列來表示對應下標的數字是不是素數。起初,將陣列所有成員標記為1,然後按照某種方法將其中的非素數都標記為0即可 2.實現 1 首先宣告乙個布林陣列isprime l 1 先將isprime 0 isprime ...