求正整數 n(n>1)的質因數的個數。 相同的質因數需要重複計算。如 120=22235 ,共有 5 個質因數。 輸入: 可能有多組測試資料,每組測試資料的輸入是乙個正整數 n,(1該**按照如下步驟對輸入的整數分解素因數:
1.利用素數篩法篩得 0 到 100000 區間內所有素數。
2.輸入 n。
3.依次測試步驟 1 中得到的素數能否整除 n,若能則表明該素數為它的乙個
素因數。
4.不斷將 n 除以該素數,直到不能再被整除為止,同時統計其冪指數。
5.若在完成某個素數的冪指數統計後, n 變為 1,則表明 n 的所有素因數全 部被分解出來,這樣就不用再去遍歷後續的素數,分解活動提前終止。
6.若遍歷、測試、分解完所有預處理出來的素數, n 仍舊沒被除成 1,則表 明 n 存在乙個大於 100000 的因子,且該因子必為其素因子,且其冪指數必然為 1。
我們首先說明為什麼素數篩法只需篩到 100000 即可,而不是與輸入資料同 規模的 1000000000。這樣處理的理論依據是: n 至多只存在乙個大於 sqrt(n) 的素因數(否則兩個大於 sqrt(n)的數相乘即大於 n)。這樣,我們只需將 n 所 有小於 sqrt(n)的素數從 n 中除去,剩餘的部分必為該大素因數。正是由於這 樣的原因,我們不必依次測試 sqrt(n)到 n 的素數,而是在處理完小於 sqrt(n) 的素因數時,就能確定是否存在該大素因數,若存在其冪指數也必為 1。 在完成查詢素因數的工作以後,我們只需簡單的把所有素因數對應的冪指數 相加,即可得到該整數素因數的個數。順便一提的是,當我們完成素因數分解後 我們同樣可以確定被分解整數因數的個數為 (e1 1) * (e2 1) … ( en 1)(由所 有的素因數不同組合數得出)。
#include
using
namespace std;
bool mark[
100001];
int prime[
100001];
int primesize;
void
init()
}}intmain()
anssize++
;//素因數個數增加
if(n ==1)
break
;//若已經被分解為1,則分解提前終止}}
if(n !=1)
int ans =0;
for(
int i =
0; i < anssize; i++
) cout << ans;
//輸出
}return0;
}
王道機試練習 求素數
題目描述 給定乙個數 n,要求判斷其是否為素數 0,1,負數都是非素數 輸入 測試資料有多組,每組輸入乙個數 n。輸出 對於每組輸入 若是素數則輸出 yes,否則輸入 no。樣例輸入 13樣例輸出 yes怎樣確定乙個數是素數?我們可以用所有大於 1 小於其本身的整數去試著 整除該數,若在該區間內存在...
計算機機試題 分解素因數
求正整數n n 1 的質因數的個數。相同的質因數需要重複計算。如120 2 2 2 3 5,共有5個質因數。可能有多組測試資料,每組測試資料的輸入是乙個正整數n,1 n 10 9 對於每組資料,輸出n的質因數的個數。1205注意 1不是n的質因數 若n為質數,n是n的質因數。如下 include i...
王道機試練習 高精度大整數加法
實現乙個加法器,使其能夠輸出 a b 的值。輸入 輸入包括兩個數 a 和 b,其中 a 和 b 的位數不超過 1000 位。輸出 可能有多組測試資料,對於每組資料,輸出 a b 的值。include include struct biginteger void set char str void o...