C语言求亲密数
如果整数 A 的全部因子(包括 1,不包括 A 本身)之和等于 B;且整数 B 的全部因子(包括 1,不包括 B 本身)之和等于 A,则将整数 A 和 B 称为亲密数。
编写程序,求 3000 以内的全部亲密数。
为解决该问题,首先定义变量 a,并为其赋初值为某个整数。按照亲密数的定义,要判断 a 中存放的整数是否有亲密数,只要计算出该整数的全部因子的累加和,并将该累加和存放到另一个变量 b 中,此时 b 中存放的也是一个整数。再计算 b 中存放整数的全部因子的累加和,将该累加和存放到变量 n 中。若 n 等于 a,则可判定变量 a 和 b 中所存放的整数是亲密数。
接下来求变量 B 的因子,算法同上,将 B 的因子之和累加到变量 n。根据亲密数的定义判断变量 n 是否等于变量 A(if(n==a)),若相等,则 A 和 B 是一对亲密数,反之则不是。
程序流程图是:
下面是完整的代码:
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
编写程序,求 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程序中,多次将某些值存储到一个变量里,一定要注意变量赋初值的位置。
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。