求亲密数

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

法一:

#include<stdio.h>
#include<math.h>
int x[3000] = { 0 };  // 从1到3000的位置全标记为0,如果检测到一个数有亲密数,就把他的亲密数标记为1。有标记可以避免对一对亲密数算两次
void memeda(int a)    //这个函数作用判断一个数a有没有亲密数,如果有则输出,并且将它的亲密数在x[]中标记,如果没有亲密数就无事发生;
{
	int b = 1; int m = sqrt(a);
	if (m * m == a)b += m;
	if (m * m != a)m++;
	for (int i = 2; i < m; i++)
	{
		if (a % i == 0)
			b += (a / i + i);
	}          //b为a所有因子之和
	int n = sqrt(b); int sum = 1;
	if (n * n == b)sum += n;
	if (n * n != b)n++;
	for (int j = 2; j < n; j++)
	{
		if (b % j == 0)
			sum += (b / j + j);
	}        //sum为b所有因子之和;
	if (sum == a && b < 3000)
	{
		printf("%d和%d是亲密数\n", a, b);
		x[a] = 1; x[b] = 1;   //将b标记,避免对b进行memeda操作
	}
}

int main()
{

	int m, n;
	for (int i = 1; i <= 3000; i++)
		if (!x[i])   //如果i没标记过,就memeda
			memeda(i);
	return 0;
}

法二:

#include<stdio.h>
int main()
{
	int a, i, b, n;
	printf("There are following friendly--numbers pair smaller than 3000:\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    ", a, b);  /*若n=a,则a和b是一对亲密数,输出*/
	}

	return 0;
}

 

posted @ 2022-03-25 10:09  小白露  阅读(270)  评论(0)    收藏  举报