编程学习之亲密数(C++描述)

亲密数

题目描述

两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。



输入

输出

3000以内的全部亲密数(输出格式:(A,B),不加换行,不加分隔符号) 一对亲密数只输出一次, 小的在前

样例输入

<code>无/<code>

样例输出

<code>(220,284)(1184,1210)(2620,2924)/<code>

分析

整道题目读完后可发现题目关键是如何判断两个数是亲密数,我们先假设存在一个函数isQMS(a,b)能帮助我们判断两个数是否是亲密数。可以使用枚举法。

<code>for(int a=2;a<=3000;a++)
{


for(int b=a+1;b<=3000;b++)
{//嵌套循环比例可能的A与B
if(isQMS(a,b))
{//如果是亲密数,则输出
cout< }
}
}/<code>

剩下的只需判断亲密数就可以了。从定义出发,整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。判断的关键在于求因子和。那么我们假设存在一个函数sumFactor(x)能帮助我们计算x的因子和。我们可以写出判断亲密数的函数。

<code>bool isQMS(int A,int B)
{
int sumA=sumFactor(A);//求出a的因子和
int sumB=sumFactor(B);//求出b的因子和
if(sumA==B && sumB==A)
{//判断亲密关系,返回结果
return true;
}else
{
return false;
}
}/<code>

到这的话综合一下整道题就可以完成了。但其实我们还能再优化一下。在主题框架的枚举部分,进行优化,减少枚举对象。

<code>for(int A=2;A<=3000;A++)
{
int B=sumFactor(A);//通过计算A的因子和,直接求出对应的B.
if(B>A && B<=3000 && A==sumFactor(B))


{
cout< }
}/<code>

这样通过求A的因子和直接计算出B,再进行相关判断,能减少枚举对象,使程序更有效率。

代码实现

<code>#include <iostream>
using namespace std;

int sumFactor(int num)
{//计算num的因子和
int sum = 0;
for (int i = 1; i < num; i++)
{// 遍历1~num-1
if (num % i == 0)// 若i是num因子,则进行累加
sum += i;
}
return sum;
}

int main()
{

for (int A = 2; A <= 3000; A++)
{ //枚举遍历3000以内的数字
int B = sumFactor(A); //B的值为A的因子和
if (B > A && B <= 3000 && A == sumFactor(B))
{ //若B的因子和也为A,且在范围内,则确定亲密数
cout << "(" << A << "," << B << ")"; //输出亲密数
}
}

return 0;
}
/<iostream>/<code>

本道题,考察了枚举法与自定义函数的使用。