自学内容网 自学内容网

C语言之寻找亲密数

目录

一 简介

二 代码实现

三 时空复杂度


一 简介

亲密数(Amicable numbers)是指两个不同的正整数A和B,它们的真因子之和(不包括自身)互为对方的值。即:

  • A的所有真因子(1到√A之间的所有能整除A的数)之和等于B;
  • B的所有真因子之和(同样不包括B本身)又等于A。

二 代码实现

在C语言中寻找亲密数的一个简单实现可以按照以下思路进行:

#include <stdio.h>
#include <math.h>

// 函数:计算一个数的真因子之和
int sumOfFactors(int num) {
    int sum = 0;
    for (int i = 1; i <= sqrt(num); i++) {
        if (num % i == 0) { // 如果i是num的因子
            // 加入因子
            sum += i;
            // 如果因子不是平方数,则其对应的大于因子本身的因子也需要加入(例如对于6,3和2都是因子,但只需要加一次3)
            if (i != num / i) {
                sum += num / i;
            }
        }
    }
    return sum - num; // 去掉数本身,得到真因子之和
}

// 主函数:遍历范围内的数查找亲密数对
void findAmicableNumbers(int limit) {
    for (int i = 2; i < limit; i++) {
        int sum_i = sumOfFactors(i);
        // 如果sum_i小于limit且sum_i不等于i(因为自身不能作为自己的亲密数)
        if (sum_i > i && sum_i < limit) {
            // 计算sum_i的因子和
            int sum_sum_i = sumOfFactors(sum_i);
            // 检查是否满足亲密数条件
            if (sum_sum_i == i && sum_sum_i != sum_i) {
                printf("(%d, %d)\n", i, sum_i); // 输出找到的亲密数对
            }
        }
    }
}

int main() {
    int maxNumber = 3000; // 设置搜索亲密数的上限
    findAmicableNumbers(maxNumber);
    return 0;
}

上述代码首先定义了一个函数 sumOfFactors 来计算一个数的真因子之和,然后在主函数 findAmicableNumbers 中遍历指定范围内的每个数,并利用这个函数来找出符合条件的亲密数对。当找到一对满足亲密数定义的数时,程序会输出这对数。

三 时空复杂度

时间复杂度:

  1. 对于 sumOfFactors 函数,它的时间复杂度主要取决于循环中的迭代次数。由于只遍历到 sqrt(num),所以该函数的时间复杂度为 O(sqrt(n))。

  2. findAmicableNumbers 函数中,外层循环遍历从2到 limit-1 的所有整数,时间复杂度为 O(limit)。对于每个数i,都需要调用一次 sumOfFactors(i)sumOfFactors(sum_i),因此内嵌的总时间复杂度也是 O(sqrt(n)) * 2(因为分别计算了两次因子和)。但由于外部循环本身是线性扫描,所以总体上 findAmicableNumbers 函数的时间复杂度为 O(limit * sqrt(n))。

空间复杂度:

  1. sumOfFactors 函数在计算过程中使用的临时变量 sum 和循环变量 i 都是局部变量,不会随输入规模增大而增加,因此空间复杂度为 O(1)。

  2. findAmicableNumbers 函数中也仅使用了局部变量 i, sum_isum_sum_i,同样不会随着输入范围 limit 的增大而增加,故其空间复杂度也为 O(1)。

总结起来,这段代码的空间复杂度为 O(1),而时间复杂度为 O(limit * sqrt(n))。


原文地址:https://blog.csdn.net/m0_61635718/article/details/136805160

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!