首页 > 编程笔记

C语言求亲密数

如果整数 A 的全部因子(包括 1,不包括 A 本身)之和等于 B;且整数 B 的全部因子(包括 1,不包括 B 本身)之和等于 A,则将整数 A 和 B 称为亲密数。

编写程序,求 3000 以内的全部亲密数。

分析

根据问题描述,该问题可以转化为:给定整数 A,判断 A 是否有亲密数。

为解决该问题,首先定义变量 a,并为其赋初值为某个整数。按照亲密数的定义,要判断 a 中存放的整数是否有亲密数,只要计算出该整数的全部因子的累加和,并将该累加和存放到另一个变量 b 中,此时 b 中存放的也是一个整数。再计算 b 中存放整数的全部因子的累加和,将该累加和存放到变量 n 中。若 n 等于 a,则可判定变量 a 和 b 中所存放的整数是亲密数。

实现

首先计算 A 的各个因子,用 A 依次对 i( i 的范围可以是1〜A-1 或者 1〜(A/2-1) ) 进行取模运算,在编程过程中一定注意 % 两边参加运算的数据必须为整数。若取模运算结果等于 0,则 i 为 A 的一个因子;否则 i 就不是 A 的因子。最终,将所求得的因子累到变量 B。

接下来求变量 B 的因子,算法同上,将 B 的因子之和累加到变量 n。根据亲密数的定义判断变量 n 是否等于变量 A(if(n==a)),若相等,则 A 和 B 是一对亲密数,反之则不是。

程序流程图是:

下面是完整的代码:
#include<stdio.h>
int main()
{
    int a, i, b, n;
    for (a = 1; a < 3000; a++)  /*穷举3000以内的全部整数*/
    {
        for (b = 0, i = 1; i <= a / 2; i++)  /*计算数a的各因子,各因子之和存放于b*/
            if (!(a % i))
                b += i;
        for (n = 0, i = 1; i <= b / 2; i++)  /*计算b的各因子,各因子之和存于n*/
            if (!(b % i))
                n += i;
        if (n == a && a < b)  /*使每对亲密数只输出一次*/
            printf("%4d--%4d\n", a, b);  /*若n=a,则a和b是一对亲密数,输出*/
    }

    return 0;
}
运行结果:
 220-- 284
1184--1210
2620--2924
程序中,多次将某些值存储到一个变量里,一定要注意变量赋初值的位置。

优秀文章

添加微信咨询 扫码添加管理员微信 扫码添加管理员微信
微信ID:biancheng_yan