百练 分解因数(递归)

E:分解因数

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
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
 
     
#include  
#include  
  
using namespace std;  
  
int n;  
//nn代表当前要分解的数字为nn,m代表要分解的(疑似)最大因子 
//返回值代表分解的种数 
int dfs(int nn,int m)  
{  
    if(nn==1)return 1;  //若分解的数字为1 
    if(m==1)return 0;  //若最大因子为1 
    
	//如果m确实是nn的因子,那么进行递归调用,并将分解种数相加 
    if(nn%m==0)return dfs(nn,m-1)+dfs(nn/m,m);  
    //否则尝试将m-1作为最大因子 
	return dfs(nn,m-1);  
}  
int main()  
{  
    int t;cin>>t;  
    while(t--)  
    {  
        cin>>n;  
        printf("%d\n",dfs(n,n));  
     }   
      
      
    return 0;  
 }   


 
    

你可能感兴趣的:(递归与分治)