数学趣题——亲密数
如果整数A的全部因子之和等于B,而B的全部因子之和等于A,则为亲密数。求3000以内的亲密数。
(1)应该事先求出1-3000所有数字的整数因子之和,存入一个数组,以提高效率
(2)由于亲密数配对是唯一的,所以如果一个元素在集合中都没有找到亲密数,那么任何一个其他的元素的亲密数也不可能是该元素了,所以其他元素在找亲密数时就不需要再考虑之前已经找过的数字。
源码如下:
1: #include <stdio.h>
2:
3: int factorSum(int a) /*求a的因子和*/
4: {
5: int i, sum = 0;
6: for(i = 1; i < a; i++)
7: if(a % i == 0) /*i是a的一个因子*/
8: sum = sum + i; /*通过变量sum累加求和*/
9: return sum; /*返回a的因子的和*/
10: }
11:
12: int isfriend(int a, int b, int i, int j) /*判断a,b是否是亲密数,是亲密数返回1,否则返回0*/
13: {
14: if(a == j && b == i )return 1;
15: else return 0;
16: }
17:
18: void friendly() /*寻找1-3000范围内的亲密数*/
19: {
20: int i , j, x[3001];
21: for(i = 1; i <= 3000; i++)
22: x[i] = factorSum(i);
23:
24: for(i = 1; i <= 3000; i++)
25: {
26: if(x[i] != -111) {
27: for(j = i + 1; j <= 3000; j++)
28: if(isfriend(x[i], x[j], i, j))
29: {
30: printf("(%d,%d) ", i, j);
31: x[j] = -111; /*表示j已经找到亲密数*/
32: }
33: }
34: }
35: }
36:
37: int main()
38: {
39: printf("There are following friendly numbers from 1 to 3000\n");
40: friendly();
41: return 0;
42: }
43: