求亲密数的C语言程序(有源码有解析)
亲密数是数学中一个有趣的概念,它描述了一对特殊的正整数之间的关系。在两个正整之间,如果它们其中一个数的所有真因子(除了数本身以外的所有正因子)之和等于另一个数,同时,另一个数的所有真因子之和也等于第一个数,那么它们就被成为亲密数。
让我们来深入理解这个概念。220 的真因子包括 1、2、4、5、10、11、20、22、44、55 和 110,将这些因子相加,我们得到: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 sumOfFactors(int num) { int sum = 1; // 1 总是任何数的因子 for (int i = 2; i * i <= num; i++) { if (num % i == 0) { sum += i; if (i * i != num) { sum += num / i; } } } return sum; } // 在给定范围内寻找亲密数 void findAmicableNumbers(int start, int end) { for (int a = start; a <= end; a++) { int b = sumOfFactors(a); if (b > a && b <= end && sumOfFactors(b) == a) { printf("%d 和 %d 是一对亲密数\n", a, b); } } } int main() { int start = 1, end = 10000; printf("在 %d 到 %d 之间的亲密数对:\n", start, end); findAmicableNumbers(start, end); return 0; }
这段代码中,sumOfFactors 函数用于计算一个数的真因子之和,它采用了一种优化的方法,只遍历到平方根,这大大提高了效率。
findAmicableNumbers 函数在给定范围内搜索亲密数对。它遍历范围内的每个数 a,计算其真因子之和 b,然后检查 b 的真因子之和是否等于 a。如果是,并且 b 大于 a(避免重复输出),就找到了一对亲密数。
在 main 函数中,我们设定了搜索范围从 1 到 10000。这个范围可以根据需要调整,但要注意,随着范围的增大,程序的运行时间也会显著增加。
运行这个程序,我们会得到如下输出:
在 1 到 10000 之间的亲密数对: 220 和 284 是一对亲密数 1184 和 1210 是一对亲密数 2620 和 2924 是一对亲密数 5020 和 5564 是一对亲密数 6232 和 6368 是一对亲密数
这个程序不仅找到了最著名的 220-284 对,还发现了其他几对亲密数。值得注意的是,亲密数在自然数中相对罕见,这使得它们在数学和编程教学中成为一个有趣的话题。
通过这个程序,我们不仅实践了数论中的一个有趣概念,还练习了函数的编写、循环控制和条件判断等基本编程技能。对于初学者来说,这是一个很好的练习,可以帮助他们理解如何将数学概念转化为实际的编程问题,并通过逐步分解问题来构建解决方案。