分解因数——递归

给出一个正整数 aaa,要求分解成若干个正整数的乘积,即 a=a1×a2×a3×...×ana = a_1 \times a_2 \times a_3 \times ... \times a_na=a1​×a2​×a3​×...×an​,并且 1<a1≤a2≤a3≤...≤an1 < a_1 \le a_2 \le a_3 \le ... \le a_n1<a1​≤a2​≤a3​≤...≤an​,问这样的分解的方案种数有多少。注意到 a=aa = aa=a 也是一种分解。

输入格式

第 111 行是测试数据的组数 n(1≤n≤10)n(1 \le n \le 10)n(1≤n≤10),后面跟着 nnn 行输入。每组测试数据占 111 行,包括一个正整数 a(1<a<32768)a (1 < a < 32768)a(1<a<32768)。

输出格式

nnn 行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的方案种数。

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制

2
2
20

样例输出复制

1
4

【分析】给一个数,求它的因式分解个数(加上数本身)。

比如12 = 2 * 6 = 2 * 2 * 3 = 3 * 4 = 12;答案为4;

16 = 2 * 8 = 2 * 2 * 4 = 2 * 2 * 2 * 2 = 4 * 4 = 16;答案为5;

即F(n) = 1 + F(div1, n / div1) + 1 + F(div2, n / div2) + ... + 1 + F(divm, n / divm) 。// div 始终小与 (n / div)

其中div 为 n 的因子, F(div, n / div) 为 n / div 的因式分解个数, n / div 分解因子不得小于 div。

故递归从2开始,到 n 结束。

 

#include <cstdio>
int sum; 
void divisor(int a, int b) {
	for (int i = a; i < b; i++) {
		if (b % i == 0 && i <= b / i) {
			sum++;
			divisor(i, b / i);
		}
		if (i > b / i) return;
	}
}
int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		int k;
		sum = 1;
		scanf("%d", &k);
		divisor(2, k);
		printf("%d\n", sum);
	}
	return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值