首先,由算術基本定理可知,任何乙個大於1的正整數,都可以分解成若干個質數的乘積,並且這種乘積的形式是唯一的。
所以,對於整數分解,如果先從最小的質數n=2開始進行分解,如果能整除,就只取商,直到不能除時,n++,然後判斷n是否大於現在的商。如果大於,結束程式。否則繼續迴圈。
核心**很短,只有10行左右。
void prim(unsigned long long m)
endl(std::cout);
}
下面來證明一下演算法的正確性。就是證明輸出的所有數都是m的因子,且它們相乘等於m。 同時,它們都是質數。
由 算術基本定理可知,任何乙個大於1的正整數,都可以分解成若干個質數的乘積,並且這種乘積的形式是唯一的。
首先,通過程式我們直接可知的是,對於輸出的n,一定是m的因子。
其次,由於只有在m可以整除n的時候,才用m /= n; 故當所有的n輸出後,所有的數字相乘 肯定等於m。
最後,這才是難點。證明所有輸出的數字均為質數。
我們用反證法來證明。
假設在所有輸出的因數中,至少存在乙個合數 k。
一方面,由演算法本身可知,在輸出k時,不存在小於k的、且大於1的能被m整除的正整數。
另一方面,由合數的定義可知, 這個合數k可以分解成至少兩個因數的乘積。這兩個因數都是小於k且大於1。對於k的這些因數(至少為兩個),我們隨便取其中的乙個p,我們可知p < k。因為m可以整除k,所以必有m可以整除p。即:存在小於k的、且大於1的正整數p,能被m整除。
矛盾!!故假設不成立。即:輸出的所有因數中,沒有合數。
也就是說,輸出的所有因數全為質數。
ok!演算法的正確性證明完畢。
測試了一下執行時間
程式4 正整數分解質因數
題目 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整...
將乙個正整數分解質因數
題目 將乙個正整數分解質因數。例如輸入90,列印90 2 3 3 5 分析 對n進行分解指數,應該先找到乙個最小的指數k,然後按照下面的步驟完成 1 如果這個指數恰好等於n,則說明分解指數的過程已經結束,列印出即可 2 如果k n,但n能被k整除,則應列印出k的值,並用n除以k的商,作為心的正整數,...
Python 練習例項14 正整數分解質因數
題目 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整...