初见安~最近开始学习数论啦,往后会经常更新关于数论的内容~多多支持~:)
这里是基础数论专题(2)【详见数论专栏
关于约数,什么意思就不用说了吧——一个数能整除的所有比它小的数【还是说了
就比如,12的约数有1, 2, 3, 4, 6, 12这6个。
恩。下面进入正题。
一、求约数个数
一个数的约数,可能是质数,也可能是合数。如果是质数的话那就很容易——我们可以直接质因数分解(详见质数专题),分解出了多少个就是多少个。那么合数呢?我们可以这样想——为什么叫做合数,因为它可以分解成几个不同的质数的乘积。看到i这里你应该也明白了——我们可以只分解质因数,然后针对分解出来的质因数的指数进行不同的组合,就可以凑出所有的约数了。
怎么组合呢——暴力想的话是想得出来的,这里我们有一个结论可以直接用——
对任意整数a>1,有,则有约数个数为:
。
下面是代码实现——
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。这里我们尝试一下合并多项式就可以得到:
所以到这里我们也就可以总结出规律了——正整数x的约数和为:
代码实现如下:
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——