首页 > 代码库 > 递归--练习5--noi1751分解因数

递归--练习5--noi1751分解因数

递归--练习5--noi1751分解因数

一、心得

想清楚子问题

想清楚递推表达式

没有全部AC说明还有自己没有想到的位置,试边界情况和查看题目要求

二、题目

1751:分解因数

总时间限制: 
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

三、AC代码

 1 /*
 2 noi1751分解因数
 3 20
 4 2*10
 5 2*2*5
 6 4*5
 7 20
 8 从1到n
 9 寻找子问题
10 当分离出来一个因数之后,剩下的数是一个子问题
11 
12 24
13 2*12(所有12的情况)12 2*6 3*4 2*2*3 
14 3*8(所有8的情况)1*8 2*4 2*2*2 
15 4*6(所有6的情况)6  2*3
16 24这种 
17 
18 我开始就没把递推关系式想清楚
19 递推表达:
20 因式分解 
21 f(20)=1+f(10)+f(5)
22         2     1
23 f(24)=1+f(12)+f(8)+f(6) 
24 f(12)=1+f(6)+f(4)//1+2+2
25 f(8)=1+f(4)//1+2
26 f(6)=1+f(3)//1+1
27 
28 */
29 #include <iostream>
30 #include <cstdio> 
31 using namespace std;
32 int f(int n,int m){
33     int ans=1;//算上本身那种情况 
34     if(n==1) return 0;
35     for(int i=m;i*i<=n;i++){//从2开始遍历找所有的能分解的情况 
36         if(n%i==0){
37             //上面相当于把子问题漏掉的那种情况加上了 
38             ans+=f(n/i,i);//把子问题的所有情况也加上 
39             //因为 a = a1 * a2 * a3 * ... * an,并且1 < a1 <= a2 <= a3 <= ... <= an,
40             //因为后面的因数要比前面大,漏了这一个 
41         }
42     }
43     return ans;
44 }
45 int main(){
46     //freopen("in.txt","r",stdin);
47     int n;
48     cin>>n;
49     for(int i=1;i<=n;i++){
50         int a;
51         cin>>a;
52         int ans=f(a,2);
53         cout<<ans<<endl;
54     }     
55     
56     return 0;
57 }

所以递归里面多了一个变量m、

递归--练习5--noi1751分解因数