求亲密数
/*如果整数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;
}