C语言 亲和数

在 C 语言中,亲和数(Amicable Numbers)是指一对不同的自然数,每个数的真因子之和等于另一个数。换句话说,对于一对亲和数 aabb,它们满足以下条件:

  • sum_of_divisors(a)=b\text{sum\_of\_divisors}(a) = b
  • sum_of_divisors(b)=a\text{sum\_of\_divisors}(b) = a

其中,sum_of_divisors(n) 表示计算 nn 的真因子之和。真因子是指除了 nn 自身外,能整除 nn 的所有数。

示例

例如,220 和 284 是一对亲和数:

  • 220 的真因子:1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110。

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

  • 284 的真因子:1, 2, 4, 71, 142。

  • 284 的真因子之和:1 + 2 + 4 + 71 + 142 = 220。

C 语言实现

以下是一个 C 语言程序示例,用于找出一对亲和数:

c
#include <stdio.h> // 函数:计算给定数的真因子之和 int sum_of_divisors(int num) { int sum = 1; // 1 是所有数的真因子 for (int i = 2; i <= num / 2; i++) { if (num % i == 0) { sum += i; } } return sum; } // 主函数 int main() { int num1, num2; // 输入两个数 printf("请输入两个正整数:\n"); scanf("%d %d", &num1, &num2); // 检查是否为亲和数 if (num1 != num2 && sum_of_divisors(num1) == num2 && sum_of_divisors(num2) == num1) { printf("%d 和 %d 是一对亲和数。\n", num1, num2); } else { printf("%d 和 %d 不是亲和数。\n", num1, num2); } return 0; }

代码解释

  1. sum_of_divisors 函数

    • 计算一个正整数的真因子之和。初始化 sum 为 1(1 是所有正整数的真因子)。
    • 使用 for 循环遍历 2 到 num / 2 的所有数,判断是否能整除 num,如果能则加到 sum 中。
    • 返回计算出的真因子之和。
  2. main 函数

    • 提示用户输入两个正整数。
    • 使用 scanf 函数读取用户输入的两个数。
    • 调用 sum_of_divisors 函数计算两个数的真因子之和,并比较是否符合亲和数的条件。
    • 根据比较结果输出是否为亲和数。

注意事项

  • 亲和数是对称的,因此检查 aabb 之间的关系时只需要确保 ab 的真因子之和分别等于对方。
  • 程序中 sum_of_divisors 函数的时间复杂度是 O(n)O(n),其中 n 是待计算的数字,可以通过优化算法来提高效率。
  • 该程序适用于处理较小范围内的亲和数。对于更大的范围,可能需要优化算法或使用不同的方法来提高性能。

通过这个示例代码,你可以理解如何在 C 语言中实现亲和数的计算和检查。如果有其他问题或需要进一步的帮助,请告诉我!