對乙個數x分解素因數即確定素數p1,p2…pn,使其滿足下式:
必要時還要確定e1,e2等冪指數。本題即求e1,e2,…en的和。
利用素數篩法預先篩選出所有可能在題面所給資料範圍內成為素因數的素數。並在程式輸入待處理數字n時,依次遍歷所有小於n的素數,判斷其是否為n的因數。若確定某素數為n的因數,則通過試除確定其對應的冪指數。最後求出各個冪指數的和即為所求。
#include bool mark[100001];
int prime[100001];
int primesize;
void init()
}}int main()
{ init();
int n;
while(scanf("%d",&n)!=eof){
int ansprime[30];//按順序儲存分解出的素因數
int anssize=0;//分解出素因數的個數
int ansnum[30];//儲存分解出的素因數對應的冪指數
for(int i=0;i該**按照如下步驟對輸入的整數分解素因數:
1.利用素數篩法篩得0到100000區間內所有素數
2.輸入n
3.依次測試步驟1中得到的素數能否整除n,若能則表明該素數為它的乙個素因數
4.不斷將n除以該素數,直到不能再被整除為止,同時統計其冪指數
5.若在完成某個素數的冪指數統計後,n變為1,則表明n的所有素因數全部被分解出來,這樣就不用再去遍歷後續的素數,分解活動提前終止
6.若遍歷,測試,分解完所有預處理出來的素數,n仍舊沒被除成1,則表明n存在乙個大於100000的因子,且該因子必為其素因子,且其冪指數必然為1
首先說明素數篩法只需篩到100000即可,而不是與輸入資料同規模的10 0000 0000.。這樣處理的理論依據是:n至多只存在乙個大於sqrt(n)的素因數(否則兩個大於sqrt(n)的數相乘即大於n)。這樣只需將n所有小於sqrt(n)的素數從n中除去,剩餘部分必為該大素因數。所以不必依次測試sqrt(n)到n的素數,而是在處理完小於sqrt(n)的素因數時就能確定是否存在該大素因數,若存在其冪指數也必為1.
完成素因數分解後同樣可以確定被分解整數因數的個數為(e1+1)(e2+1)…*(en+1),即有所有的素因數不同組合數得出,i(加1是表示不選擇該素因數,所以素因數pn有en+1種選擇情況)最終結果沒有減1是因為算上了因數1.
素數 九度教程第51題
依次列舉每個數判斷其是否為素數,複雜度過高,且整個過程顯得粗暴而不具有技巧性。下面提出一種更好的辦法解決該問題。首先考慮這樣乙個命題 若乙個數不是素數,則必存在乙個小於它的素數為其因數。這個命題顯然是正確的。假如已經獲得了小於乙個數的所有素數,只需確定該數不能被這些素數整除,這個數即為素數。但是這樣...
九度OJ 1207 質因數的個數
題目1207 質因數的個數 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 9302 解決 3019 題目描述 求正整數n n 1 的質因數的個數。相同的質因數需要重複計算。如120 2 2 2 3 5,共有5個質因數。輸入 可能有多組測試資料,每組測試資料的輸入是乙個正整數n,1 輸出...
九度oj題目1207 質因數的個數
題目描述 求正整數n n 1 的質因數的個數。相同的質因數需要重複計算。如120 2 2 2 3 5,共有5個質因數。輸入 可能有多組測試資料,每組測試資料的輸入是乙個正整數n,1 輸出 對於每組資料,輸出n的質因數的個數。樣例輸入 120 樣例輸出 5 注意 1不是n的質因數 若n為質數,n是n的...