数论问题之约数 C语言实现 python实现
一、引言
最近在努力上岸中,发现很多需要C语言机试,所以后面我要有两个版本的实现,不能有了python忘了C,冲!
二、求约数
2.1 试除法求约数
- 原理:假设要求n的约数,则枚举\([1,n]\),看是否能整除n,可以的话说明该数是n的约数
- 优化:只枚举\([1,\sqrt n]\)
一个数d如果是n的约数,那么n/d也是n的约数。因此,可以只枚举较小的约数,较大的约数可以通过计算得到 - 代码实现
C版本
#define N 100010
int res[N];
void get_divisors(int n){
int idx = 0;
int count = 0;
for(int i = 1; i <= n / i; i++){
if(n % i == 0){
res[idx++] = i;
count ++;
if( i != n / i){
res[idx++] = n / i;
count ++;
}
sort(res); //快排排序一下
}
python版本
def get_divisors(n):
res = []
i = 1
while i <= n // i:
if n % i == 0:
res.append(i)
if i != n // i:
res.append(n // i)
i += 1
return res
三、求约数个数
-
基于算术基本定理
-
原理:如果一个数N满足\(N = p_1^{\alpha_1} \times p_2^{\alpha_2} \times p_3^{\alpha_3} \times ... \times p_k^{\alpha_k}\),则约数个数为\((\alpha_1+1) \times (\alpha_1+1)(\alpha_3+3) \times ... \times (\alpha_k+k)\)
-
代码实现
C版本
typedef long long LL;
LL get_num(LL x){
if(x == 1){
return 1;
}
if(x == 2 || x == 3){
return 2;
}
LL res = 1;
for(int i = 2; i <= x / i; i ++){
int num = 0;
while(x % i == 0){
x /= i;
num++;
}
res *= (num + 1);
}
if(x > 1) res *= 2;
return res;
}