做題感悟:分解因數
阿新 • • 發佈:2018-11-28
其實,這是一道非常簡單的題,但是我把它想複雜了。。。
分解因數
- 總時間限制: 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 }