数学趣题——亲密数

如果整数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:  
posted @ 2010-05-26 10:31  红脸书生  阅读(960)  评论(0编辑  收藏  举报