笨人小白的温故知新——递归(1)

信息奥赛一本通—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 ;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值