数论问题之约数 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;
}

四、约数之和

posted @ 2022-07-15 23:29  要兵长还是里维  阅读(102)  评论(0编辑  收藏  举报