質因數分解

2021-10-06 05:06:18 字數 1052 閱讀 8401

一道清華的復試題,我先後看了兩份**,收穫匪淺,分別摘自下面兩個部落格:

第乙個部落格我可以看懂,意思很明白,第二個部落格涉及到知識盲區了,原來還可以這麼簡單的做出來:

#include #include using namespace std;

/*判斷是否為質數*/

bool prime(int n) }

return true;}

/*尋找質因數的個數*/

int factor_num(int n)

if (n%i != 0 || !prime(i))//i不是n的因數 || i不是質數

if (prime(i))//i是n的乙個質因數

}return num;}

int main()

比較簡單,就是先判斷此時的n是不是質因數,是的話代表已經數完了,為什麼呢,為什麼能保證此時n為質數就一定是最後乙個因數呢,也就是說比如有n個質因數,不存在我數到中間的時候,後面因數的乘積是乙個質數嘍?中間的每次n=n/i,n都是乙個非質數嘛?

有兩種思路:

1.此時n是質數,不可能再分了,所以停止計算。

2.是的,因為我們數質數的過程是從小的質數開始的,比如120=2*2*2*3*5,我們會把所有的小質數2都數完再繼續往下進行,所以在中間過程中如果n是個非質數,代表還有其他的質數沒有被找到,且》=當前的i,所以繼續進行,一旦n此時是質數了,表示這就是所能達到的最大的質因數了,不存在更大的質數了,所以輸出。

第二步如果不是n的因數或者不是質數,就捨棄,繼續往下走。

第三步,i是質數,那麼n=n/i,i再從頭開始找。

這份**比較容易理解,那也是因為我之前不知道下面的東西,所以覺得挺好的了。

#include#include#includeusing namespace std;

int main()

}cout《當時看了這份**是矇圈的,完全不知道為啥,現在看看其實也能理解了。其實一切的一切都是因為是從小到大遍歷i的,即便n有很多合數因數,也已經被拆分成更小的質數了,所以上面s.push(i)中的每乙個i都是乙個質數!很神奇。

質因數分解

題目16 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完 成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新...

質因數分解

短除法 求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法 和除法的性質差不多,還可以用來求多個個數的公因式 求 最大公因數的一種方法,也可用來求 最小公倍數。求幾個數最大公因數 的方法,開始時用觀察比較的方法,即 先把每個數的因數找出來,然後再找出公因數,最...

質因數分解

講乙個數分解為幾個質數相乘的結果 int a maxn 用來存質因數 int b maxn 用來存質因數的個數 int main if n 1 不能忘記這一步操作 輸出 第1種寫法 a a a b b b b c c printf 第一種寫法 for int i 1 i tot i else pri...