質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數,質數也叫素數。
與質數相對的是合數,合數是指在大於1的整數中除了能被1和本身整除外,還能被其他數整除的數。
bool
is_prime
(int n)
迴圈中不建議寫成i<=sqrt(n),因為sqrt函式很慢,每次for迴圈都會執行一遍,耗時。
也不要寫成i*i<=n,會存在溢位風險。
時間複雜度:o(sqrt(n))
把乙個合數分解成若干個質因數的乘積的形式,即求質因數的過程叫做分解質因數。
如:12=2 * 2 * 3
void
divide
(int n)
cout<" "/s是i的次方數}if
(n>
1) cout<" "<<1;
//此時n是大於根號n的那個質因子
}
時間複雜度:o(sqrt(n))(最壞情況下)
為什麼這裡也只用迴圈到n/i就行了呢?
因為,n的質因子最多只有乙個大於sqrt(n)的(很好證明,因為如果有兩個的話相乘就大於n了,這是矛盾了),所以,我們只需要先找到小於sqrt(n)的質因子,迴圈結束後,n若是大於1的,說明此時這個n就是那個大於sqrt(n)的質因子。
我們可能會疑問,我們要找的是n的所有的質因子,可是你在迴圈內列舉時 i 是從2 ~ n/i的,這中間i可是包含的有合數的,會不會有問題呢?
其實,是沒有問題的,因為當我們列舉到 i 時,就意味著我們已經把 n 的2~i-1的所有質因子都除乾淨了(n/=i),也就是說我們此時的n中不含有2 ~ i -1的任何質因子了,如果滿足if(n%i == 0),那麼說明 i 中也一定不含2 ~ i -1的任何質因子,那麼這個 i 一定是個質數。
質數篩以及質因數分解
今天正式學了一遍質數篩 已經可以打線性的質數篩了!以及質因數分解,要做乙個小小的總結。質數 除了1和它本身沒有其他的因數,一般指的都是正整數。篩法 篩法是一種簡單檢定素數的演算法。篩法的具體做法 給出要篩數值的範圍n,找出n以內的素數p1,p2,p3,pk。先用2去篩,即把2留下,把2的倍數剔除掉 ...
質因數分解
題目16 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完 成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新...
質因數分解
短除法 求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法 和除法的性質差不多,還可以用來求多個個數的公因式 求 最大公因數的一種方法,也可用來求 最小公倍數。求幾個數最大公因數 的方法,開始時用觀察比較的方法,即 先把每個數的因數找出來,然後再找出公因數,最...