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

C语言求亲密数(有源码有解析)

在数学世界中,有一种有趣的数字关系被称为“亲密数”。亲密数是一对正整数,它们之间存在着特殊的联系:第一个数的所有真因子(除去数本身的因子)之和等于第二个数,而第二个数的所有真因子之和又恰好等于第一个数。

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

举个例子来说明亲密数的概念。考虑数字对 220 和 284,我们来看看它们的真因子:

220 的真因子:1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110
284 的真因子:1, 2, 4, 71, 142

如果我们计算这些因子的和,会发现:

220 的真因子之和 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284
284 的真因子之和 = 1 + 2 + 4 + 71 + 142 = 220

正是因为它们满足这种独特的关系,220 和 284 被称为一对亲密数。
 

现在我们了解了亲密数的概念,让我们来探讨如何用C语言编写一个程序来找出亲密数对。实现这个功能的关键在于以下几个步骤:


让我们来看看如何将这个逻辑转化为C语言代码:

#include <stdio.h>

// 计算一个数的真因子之和
int sumOfDivisors(int n) {
    int sum = 1;  // 1 总是任何数的因子
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            sum += i;
            if (i * i != n) {
                sum += n / i;
            }
        }
    }
    return sum;
}

// 在给定范围内寻找亲密数对
void findAmicableNumbers(int limit) {
    for (int a = 2; a < limit; a++) {
        int b = sumOfDivisors(a);
        if (b > a && b < limit && sumOfDivisors(b) == a) {
            printf("%d 和 %d 是一对亲密数\n", a, b);
        }
    }
}

int main() {
    int limit = 10000;  // 设置搜索上限
    findAmicableNumbers(limit);
    return 0;
}

这个程序会在 2 到 10000 的范围内搜索亲密数对。程序的核心是 sumOfDivisors 函数,它高效地计算一个数的所有真因子之和。在 findAmicableNumbers 函数中,我们遍历每个数,计算它的真因子之和,然后检查是否存在互为真因子之和的数对。
 

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

220 和 284 是一对亲密数
1184 和 1210 是一对亲密数
2620 和 2924 是一对亲密数
5020 和 5564 是一对亲密数
6232 和 6368 是一对亲密数

这个程序展示了如何将数学概念转化为计算机算法。通过使用高效的因子计算方法和适当的循环结构,我们能够在合理的时间内找到多对亲密数。这种方法不仅可以用于寻找亲密数,还可以扩展到其他类似的数论问题,如完全数的寻找等。
 

对于初学者来说,这个程序涉及了几个重要的编程概念:函数的定义和使用、循环结构、条件判断,以及如何将数学逻辑转化为代码。通过学习和理解这个程序,初学者可以加深对这些基本概念的理解,同时也能体会到数学和编程之间的紧密联系。

相关文章