递归--练习5--noi1751分解因数
Posted 范仁义
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归--练习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分解因数的主要内容,如果未能解决你的问题,请参考以下文章