问题描述:若正整数 A 的所有因子(包括 1 但不包括自身,下同)之和为 B,而 B 的因子之和
为 A,则称 A 和 B 为一对亲密数。
例如,6 的因子之和为 1+2+3=6,因此 6 与 6 为一对亲密 数 ( 即 6 自 身 构 成 一 对 亲 密 数 ) ; 又 如 , 220 的 因 子 之 和 为 l+2+4+5+10+11+20+22+44+55+110=284,
而 284 的因子之和为1+2+4+71+142=220,因此,220 与284为一对亲密数。
编写程序,求 500以内的所有亲密数对。程序需要自定义两个函数,output函数取500以内的数值,并调用facsum()函数,根据返回值判断是否是亲密数,如果是输出结果;facsum函数求因子和,因子和要返回到output()函数;声明如下:int facsum(int n);void output();。
输入格式:取3-500之间的数,一一进行判断。
输出格式:
输入样例1:
无
输出样例1:(逗号为英文状态)
6,6
28,28
220,284
496,496
涉及知识点:for循环,取余运算符,求累加和
#include <stdio.h>
// 函数声明
int facsum(int n); // 计算因子和
void output(); // 输出亲密数对
int main()
{
output();
return 0;
}
// 计算一个数的因子和
int facsum(int n)
{
int sum = 1; // 因子和初始化为1(1是所有正整数的因子)
for (int i = 2; i <= n / 2; i++)//因为在找因子的时候,最大的因子不会超过数值的一半,故n/2
{
if (n % i == 0)
{
sum += i; // 累加因子
}
}
return sum;
}
// 输出亲密数对
void output()
{
for (int a = 3; a <= 500; a++)
{
int b = facsum(a); // 计算第一个数的因子和
if (b >= a && b <= 500) // 包含自身并确保因子和在范围内
{
int sum_b = facsum(b); // 计算因子和对应的数的因子和
if (sum_b == a) // 如果因子和对应的数的因子和等于原数,则为亲密数对
{
printf("%d,%d\n", a, b); // 输出亲密数对
}
}
}
}
运行结果: