专题·约数【including 求约数个数,求约数之和

初见安~最近开始学习数论啦,往后会经常更新关于数论的内容~多多支持~:)

这里是基础数论专题(2)【详见数论专栏

关于约数,什么意思就不用说了吧——一个数能整除的所有比它小的数【还是说了

就比如,12的约数有1, 2, 3, 4, 6, 12这6个。

恩。下面进入正题。

一、求约数个数

一个数的约数,可能是质数,也可能是合数。如果是质数的话那就很容易——我们可以直接质因数分解(详见质数专题),分解出了多少个就是多少个。那么合数呢?我们可以这样想——为什么叫做合数,因为它可以分解成几个不同的质数的乘积。看到i这里你应该也明白了——我们可以只分解质因数,然后针对分解出来的质因数的指数进行不同的组合,就可以凑出所有的约数了。

怎么组合呢——暴力想的话是想得出来的,这里我们有一个结论可以直接用——

对任意整数a>1,有\large a=p1^{a1}*p2^{a2}*...*pn^{an},则有约数个数为:\large (1+a1)*(1+a2)*...*(1+an)

下面是代码实现——

int num(int n)
{
	int k, ans, x;
	k = 2; ans = 1;
	while(k <= n / k)//避免k方报错
	{
		p = 1;
		while(n % k == 0)//质因数分解
		{
			n /= k; p++;
		}
		ans *= p;
		k++;
	}
	if(n > 1) ans *= 2;//本身为质数
	return ans;
}

 

二、求约数和

这个问题一般比较少见,但是还是很有意思的——有公式,我们尝试推导一下。

仍然是之前的那个例子——12的约数有1,2,3,4,6,12,也就是1,2,3,2^2,2*3,2^2*3,和就是1+2+2^2+3+2*3+2^2*3。这里我们尝试一下合并多项式就可以得到:

\large 1+2^{1}+2^{2}+3^{1}+2^{2}*3=(1+2^{1}+2^{2})*(1+3^{1})

所以到这里我们也就可以总结出规律了——正整数x的约数和为:

\large (1+p1^{1}+p1^{2}+...+p1^{a1})*...*(1+pn^{1}+pn^{2}+...+pn^{an})

代码实现如下:

int num(int x)
{
	int k = 2, ans = 1, temp;
	while(k <= x / k)
	{
		temp = 1;
		while(x % k == 0)
		{
			x /= k;
			temp = temp * k + 1;
		}
		ans *= temp;
		k++;
	}
	if(x > 1) ans *= (1 + x);
	return ans;
}

 

有这么个例题:判断一个数是否能分解成两个合数的乘积。这里我们质因数分解,只要至少能分解出4个质因子即可。当然,2的4次方16是一个满足要求的数。

关于约数的内容就到这里啦~

迎评:)
——End——

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值