數學苦手來計算 1+1 的答案了,以下內容可能引起某些dalao的不適或血壓公升高,建議快速跳過,純當樂子。
對於任何乙個數n,其因子可以兩兩配對,我們列舉小因子。易知小因子 >=sqrt(n),大因子 >=sqrt(n),因此考慮從 2 到 sqrt(n) 列舉小因子。同時應該考慮大因子,因為並不是所有質因子都 <=sqrt(n) 的!
但是網上的試除法是這樣說的:
掃瞄 2 到 sqrt(n) 中的每個數,如果 x 能整除 n,從 n 中除掉所有質因子 x這樣掃瞄出來的x確實全部都是質數,但是並沒有考慮大因子,因此我覺得這是有問題的(顯然是因為我太弱了~_~|||)
比如 17*2*2*3=204,sqrt(204)=14.2828568570587
考慮什麼樣的大因子不會被列舉到。首先這個大因子應該 >=sqrt(n),也就是說沒有比它更大的質因子了,而且這樣沒有被列舉到的大質因子只能有乙個。
根據這個,似乎可以改進我的演算法:
v[ ] 為質數表 is[ ]為合數標記
原演算法 divide1 需要遍歷到 n 的最大質因子
inline void divide1(intx)
int pos=1
;
while(x!=1
)
}++pos;
}}
現演算法 divide2 需要遍歷到 min(floor(sqrt(n)),n的最大質因數))
inline void divide2(intx)
int pos=1
;
int li=sqrt(x);
while(x!=1&&v[pos]<=li)
}++pos;
}if(x!=1
)
}
執行時間對比
演算法1:0.0010000
演算法2:0.0000000
演算法1:0.0030000
演算法2:0.0010000
可見對於部分特殊資料,優化還是有用的。
加快了自己分解質因數的時間效率,已經為之後學習更優的演算法提供了動力。
我知道這種東西誰都會。所以請包容弱小的我。
分解質因數
質因數概念 每個合數都可以寫成幾個質數相乘的形式,這幾個質數就都叫做這個合數的質因數。如果乙個質數是某個數的因數,那麼就說這個質數是這個數的質因數。而這個因數一定是乙個質數。演算法原理 先根據需要分解的合數生成乙個質數表。然後依次從小到大依次除合數,每次除之後都將儲存步驟。表達不好,還是看 吧 us...
分解質因數
分解質因數 問題描述 求出區間 a,b 中所有整數的質因數分解。輸入格式 輸入兩個整數a,b。輸出格式 每行輸出乙個數的分解,形如k a1 a2 a3.a1 a2 a3.k也是從小到大的 具體可看樣例 樣例輸入 3 10 樣例輸出 3 34 2 2 5 56 2 3 7 78 2 2 2 9 3 3...
分解質因數
大數的質因數分解一直以來是亟需解決的難題。本文從最基本的試除法開始,分解質因數的方法。下面的程式在開頭定義了乙個巨集opt,如果刪掉這個定義,就可以執行最原始的演算法。一 樸素演算法 include include include using namespace std define opt int...