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 是一对亲密数
这个程序展示了如何将数学概念转化为计算机算法。通过使用高效的因子计算方法和适当的循环结构,我们能够在合理的时间内找到多对亲密数。这种方法不仅可以用于寻找亲密数,还可以扩展到其他类似的数论问题,如完全数的寻找等。
对于初学者来说,这个程序涉及了几个重要的编程概念:函数的定义和使用、循环结构、条件判断,以及如何将数学逻辑转化为代码。通过学习和理解这个程序,初学者可以加深对这些基本概念的理解,同时也能体会到数学和编程之间的紧密联系。