一道清華的復試題,我先後看了兩份**,收穫匪淺,分別摘自下面兩個部落格:
第乙個部落格我可以看懂,意思很明白,第二個部落格涉及到知識盲區了,原來還可以這麼簡單的做出來:
#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...