C语言习题_打印亲密数对

什么是亲密数对?

‌亲密数对是指两个整数,它们的所有因子(除了自身)之和等于另一个整数。‌

先上题目

若正整数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); 后面 , 得出最开始的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值