1. 程式人生 > >1200:分解因數

1200:分解因數

計算 while tst ria end 包括 c++ 這樣的 string

描述

給出一個正整數a,要求分解成若幹個正整數的乘積,即a = a1 * a2 * a3 * ... * an,並且1 < a1 <= a2 <= a3 <= ... <= an,問這樣的分解的種數有多少。註意到a = a也是一種分解。

輸入

第1行是測試數據的組數n,後面跟著n行輸入。每組測試數據占1行,包括一個正整數a (1 < a < 32768)

輸出

n行,每行輸出對應一個輸入。輸出應是一個正整數,指明滿足要求的分解的種數

寫法一:直接搜索,從a1搜素到an,滿足條件則+1。

 1 #include<bits/stdc++.h>
 2
using namespace std; 3 int x,ans; 4 void dfs(int p,int k){ //p表示乘積,k表示當前的因子 5 if(p==x){ 6 ans++; 7 return; 8 } 9 for(int i=k;i<=x;i++){ 10 if(p*i>x)break; 11 if(x%i==0)dfs(p*i,i); 12 } 13 } 14 int main(){ 15 int n; 16 scanf("%d",&n);
17 while(n--){ 18 ans=0; 19 scanf("%d",&x); 20 dfs(1,2); 21 printf("%d\n",ans); 22 } 23 return 0; 24 }

寫法二:

 1 #include <iostream>  
 2 #include <cstdio>  
 3 #include <cstdlib>  
 4 #include <cmath>  
 5 #include <cstring>  
 6
#include <string> 7 #include <queue> 8 #include <algorithm> 9 using namespace std; 10 11 int sum; 12 13 void count(int a,int b) 14 { 15 for(int i=a;i<b;i++) 16 { 17 if(b%i==0&&i<=b/i) 18 { 19 sum++; 20 count(i,b/i);//遞歸計算 21 } 22 if(i>b/i) break; 23 } 24 } 25 int main() 26 { 27 int n; 28 int a; 29 30 cin >> n; 31 while(n) 32 { 33 sum = 1; 34 cin >> a; 35 count(2,a); 36 cout<<sum<<endl; 37 n--; 38 } 39 return 0; 40 }

墻裂建議把以上兩個代碼模擬一遍

1200:分解因數