信息奥赛一本通—1200:分解因数
我的思路(但操作性极低
先通过分解20来找规律:20 = 20 = 2*10 = 4*5 = 2*2*5 共4种
发现:因子中,素数因子对分解种数没有贡献,合数因子对分解种数才有贡献
但这个比较复杂,所以我参考了大佬的做法,现在开始~
如何得到这个思路?
1)发现递归
仍用20来举例,
20 = 2*10 = 2*2*5
2*5是由10分解而来的,这时,我们很容易想到递归:20的分解数有一部分是10的分解数贡献的。
2)避免重复计算
20 = 2*10 = 10 *2,显然这是两种分解方法是同一种。
那么为了规避这种情况,我规定,因子从小到大,因子数则从多到少。
每进行一次分解,就要保证因数>=前一次分解出的因数。
定义函数fenjie()。现在我们需要考虑如何定义里面的参数。
3)综合考虑
因为最先提出来的因数小,所以k/i才有可能继续提出因子,所以k/i作为下一步要分解的数。
那现在要考虑被除数了。因为要保证因数>=前一次分解出的因数,所以是fenjie(k/i,i)
#include <iostream>
using namespace std ;
int fenjie(int k , int st){
//fenjie(要进行分解的数,因数)
if(k == 1) return 1 ;
//如果k==1,说明已经分解穷尽了
//又因为a=a也是一种情况,所以返回值为1
int s = 0 ;//s为分解的方法数
for(int i = st ; i <= k ; i ++){
if(k % i == 0)
s += fenjie(k/i , i) ;
}
//保证分解的因子和因子数是逐渐递增的,避免重复计算
return s ;
}
int main(){
int n , a ; cin >> n ;
for(int i = 0 ; i < n ; i ++){
cin >> a ;
cout << fenjie(a , 2) << endl ;
}
return 0 ;
}
334

被折叠的 条评论
为什么被折叠?



