什么是亲密数对?
亲密数对是指两个整数,它们的所有因子(除了自身)之和等于另一个整数。
先上题目
若正整数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以内的所有亲密数对
上代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int sumfact(int n) { //得到因数之和
int m = 0;
for (int b = 1; b < n; b++) {
if (n % b == 0)
m += b;
}
return m;
}
int main() {
int n, m; int count = 0; int arr[100] = { 0 };
printf("亲密数对:\n");
for (int n = 1; n <= 500; n++) {
int a = sumfact(n);
for (int k = 1; k <= 500; k++) {
int c = sumfact(k);
if (a == k && c == n) {
for (int a = 0; a <= count; a++) {
if (arr[a] == n) { //如果之前出现过,跳出这次打印
goto jump;
}
}
printf("%d--%d\n", n, k);
jump:
arr[count] = k; //把出现过的亲密数存入数组中
count++;
}
}
}
return 0;
}
代码结果如下:
思路如下:
1.首先,自定义一段函数sumfact , 求一个数的所有因数之和
2.设n和k是要判断的一对亲密数 , 分别从0到500遍历 , 两者分别进入循环 , 返回值n的因数和赋给a , k的因数和赋给c
3. 然后判断a等于k ,且c等于n时进行打印
但是如果就这样结束,会出现重复打印 , 我一开始的代码和运行结果如下:
如上 , 200–284重复了两次,为了避免这次重复,我的解决方案:
利用数组 , 每次打印了一个亲密数 , 就把第二个亲密数存入数组中 , 之后每次进入打印条件之前判断第一个亲密数有没有和数组中出现过的亲密数重复 , 如果出现重复,利用goto语句跳过本次打印
for (int a = 0; a <= count; a++) {
if (arr[a] == n) {
goto jump;
}
}
jump放在printf(“%d–%d\n”, n, k); 后面 , 得出最开始的代码