思路:对当前的数进行分析,如果是因数并且小于等于下一个因数,则进行递归。
#include <bits/stdc++.h>
using namespace std;
#define MAXN 300
int visited[MAXN];
int cnt;
bool flag=true;
void tracback(int x,int n)
{
int i;
for(i=x; i<=n; i++)
{
if(n%i==0&&i<=n/i)
{
cnt++;
tracback(i,n/i);
}
}
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
cnt=1;
cin>>n;
tracback(2,n);
cout<<cnt<<endl;
}
return 0;
}
另附一道与本题思路相似的题目:
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1318
1、对当前的数与和进行递归
2、用visited数组存放的是其数值
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
#define MAXN 300
int visited[MAXN];
int cnt;
bool flag=true;
void tracback(int x,int m,int step)
{
int i;
for(i=x; i<=n-m; i++)
{
if(i==n)
return ;
if((i+m)<n)
{
visited[step]=i;
tracback(i,m+i,step+1);
}
if((i+m)==n)
{
visited[step]=i;
cout<<n<<"=";
flag=true;
for(int j=1; j<=step; j++)
{
if(flag)
flag=false;
else
cout<<"+";
cout<<visited[j];
}
cout<<endl;
return ;
}
}
}
int main()
{
cin>>n;
tracback(1,0,1);
return 0;
}