首页 > 编程笔记 > C语言笔记

C语言求亲密数对的代码(附带解析)

在数学的世界里,有一些数字之间存在着奇妙的联系,而亲密数就是其中一种有趣的数字关系。亲密数是指两个正整数,其中每个数的所有真因数(除了数本身以外的所有正因数)之和等于另一个数。这种独特的数学关系最早可以追溯到毕达哥拉斯学派,后来在伊斯兰数学家中得到了进一步的研究和发展。

真因子也称真除数,一个数的真因子是指能够整除该数且不等于该数本身的因子。换句话说,真因子是除了数本身以外的所有正因子。

举个例子来说,220 和 284 就是一对著名的亲密数。我们来验证一下:220 的真因数有 1、2、4、5、10、11、20、22、44、55 和 110,这些因数的和恰好是 284。同样地,284 的真因数有 1、2、4、71 和 142,它们的和正好是 220。
 

了解了亲密数的概念后,我们来探讨如何用C语言编写程序来寻找亲密数对。我们的主要思路是设计一个函数来计算一个数的所有真因数之和,然后利用这个函数来判断两个数是否构成亲密数对。


在实际编程中,我们需要注意以下几点:


下面是一个实现这一思路的C语言程序:

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

// 计算一个数的真因数之和
int sum_of_proper_divisors(int n) {
    int sum = 1;  // 1 总是任何数的因数
    int i;
    for (i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            sum += i;
            if (i != n / i) {  // 避免完全平方数重复计算
                sum += n / i;
            }
        }
    }
    return sum;
}

// 检查两个数是否为亲密数对
int are_amicable(int a, int b) {
    return (sum_of_proper_divisors(a) == b && sum_of_proper_divisors(b) == a);
}

int main() {
    int limit = 10000;  // 设置搜索上限
    int a, b;

    printf("10000 以内的亲密数对:\n");
    for (a = 2; a < limit; a++) {
        b = sum_of_proper_divisors(a);
        if (a < b && b < limit && are_amicable(a, b)) {
            printf("%d 和 %d\n", a, b);
        }
    }

    return 0;
}

这个程序首先定义了 sum_of_proper_divisors 函数来计算一个数的真因数之和,该函数通过遍历到平方根来提高效率。然后,are_amicable 函数用于检查两个数是否构成亲密数对。在主函数中,我们遍历 2 到 10000 之间的所有数,对每个数 a,计算其真因数之和 b,然后检查 a 和 b 是否构成亲密数对。为了避免重复输出,我们只在 a < b 时输出结果。
 

运行这个程序,我们可以得到如下输出:

10000 以内的亲密数对:
220 和 284
1184 和 1210
2620 和 2924
5020 和 5564
6232 和 6368

这个程序展示了如何将数学概念转化为实际的编程问题,并通过合理的算法设计来高效地解决问题。通过学习这个例子,初学者可以了解到如何将复杂的问题分解为小的函数,如何优化算法以提高效率,以及如何在程序中实现数学逻辑。这不仅能帮助理解亲密数这个数学概念,还能提高C语言编程技能。

相关文章