1. 程式人生 > >做題感悟:分解因數

做題感悟:分解因數

其實,這是一道非常簡單的題,但是我把它想複雜了。。。

分解因數

總時間限制: 1000ms
 
記憶體限制: 65536kB
描述 :給出一個正整數a,要求分解成若干個正整數的乘積,即a = a1 * a2 * a3 * ... * an,並且1 < a1 <= a2 <= a3 <= ... <= an,問這樣的分解的種數有多少。注意到a = a也是一種分解。
輸入:第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括一個正整數a (1 < a < 32768)
輸出:n行,每行輸出對應一個輸入。輸出應是一個正整數,指明滿足要求的分解的種數
樣例輸入
    2
    2
    20
樣例輸出
    1
    4
這道題的所求就是求出因數分解的種數,因此我們可以開一個計數器來記錄種數,只要做到不重不漏即可。
而之前我由於考慮不周全,因此加了很多額外的限制條件,從而使簡單的問題變得十分複雜,這一定是不可取的,包括特判都應該慎用。
首先這道題的出口已經很明確了,就是當分解的最後一位是1的時候便結束遞迴,計數器加一。那麼,我們便可以從2開始列舉(從1開始會形成死迴圈:永遠無法分解到1),不斷用分解得到的數去除(2~這個數)(由於本身也可以作為分解)若能整除便繼續對下一位進行操作(有點類似gcd,但是那個是%,其實這才是真正意義上的輾轉相“除”)qwq,最終我們便可以得到分解的總數。
好的,您應該理解了
最後,附上本題程式碼
 1 #include<iostream>
 2 using namespace std;
 3 int j,k,n;
 4 void ac(int s,int m)
 5 {
 6     if(s==1)
 7     {
 8         k++;
 9         return;
10     }
11     else
12     {
13         for(int i=m;i<=s;++i)
14         {
15             if
(s%i==0) 16 { 17 ac(s/i,i); 18 } 19 } 20 } 21 } 22 int main() 23 { 24 scanf("%d",&n); 25 for(j=1;j<=n;++j) 26 { 27 k=0; 28 int t; 29 scanf("%d",&t); 30 ac(t,2); 31 printf("%d\n",k); 32 } 33 }