
亲和数(Amicable Numbers)是指一对不同的自然数,其中一个数的所有真因子(不包括它本身)的和等于另一个数。本文将详细讲解如何使用C语言编写一个程序来判断两个数是否为亲和数。
核心观点:
- 真因子求和
- 判断条件
- 代码实现
真因子求和是实现亲和数判断的关键步骤。真因子是指一个数的所有小于它本身的因子之和。例如,对于数字220,它的真因子有1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110,其和为284。我们需要编写一个函数来计算一个数的真因子和。
一、真因子求和
在C语言中,我们需要遍历从1到某个数的一半,检查这些数字是否为该数的因子,然后将这些因子相加。以下是一个示例函数:
#include <stdio.h>
// 计算一个数的真因子和
int sum_of_proper_divisors(int num) {
int sum = 0;
for (int i = 1; i <= num / 2; i++) {
if (num % i == 0) {
sum += i;
}
}
return sum;
}
二、判断条件
在得到了两个数的真因子和之后,我们需要检查它们是否满足亲和数的条件。即:第一个数的真因子和等于第二个数,且第二个数的真因子和等于第一个数。
// 判断两个数是否为亲和数
int are_amicable(int num1, int num2) {
return sum_of_proper_divisors(num1) == num2 && sum_of_proper_divisors(num2) == num1;
}
三、代码实现
下面是完整的C语言程序代码,它包含了上述两个功能,并且从用户输入两个数,判断它们是否为亲和数:
#include <stdio.h>
// 计算一个数的真因子和
int sum_of_proper_divisors(int num) {
int sum = 0;
for (int i = 1; i <= num / 2; i++) {
if (num % i == 0) {
sum += i;
}
}
return sum;
}
// 判断两个数是否为亲和数
int are_amicable(int num1, int num2) {
return sum_of_proper_divisors(num1) == num2 && sum_of_proper_divisors(num2) == num1;
}
int main() {
int num1, num2;
printf("Enter two numbers: ");
scanf("%d %d", &num1, &num2);
if (are_amicable(num1, num2)) {
printf("%d and %d are amicable numbers.n", num1, num2);
} else {
printf("%d and %d are not amicable numbers.n", num1, num2);
}
return 0;
}
四、优化和扩展
1、优化真因子求和函数
对于真因子求和,可以通过减少循环次数来优化。我们只需要循环到平方根,然后同时计算两个因子。
int sum_of_proper_divisors(int num) {
int sum = 1; // 1 is always a divisor
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
if (i * i == num) {
sum += i;
} else {
sum += i + num / i;
}
}
}
return sum;
}
这种方法减少了循环次数,从而提高了效率。
2、增加用户输入验证
为了提高程序的健壮性,可以增加对用户输入的验证,确保输入的是有效的正整数。
#include <ctype.h>
int is_valid_input(char *input) {
for (int i = 0; input[i] != '