咩咩羊def 发表于 2024-5-28 08:50:38

C语言亲密数求教!!!


问题描述】给出一个数,寻找小于这个数的所有亲密数对。
【输入形式】

【输出形式】
【样例输入】

300
【样例输出】

220 284

FishC 发表于 2024-5-28 08:50:58

亲密数是指两个正整数中,第一个数的所有真因子之和等于第二个数,而且第二个数的所有真因子之和等于第一个数。例如,220的所有真因子(除了其本身)是1、2、4、5、10、11、20、22、44、55和110,它们的和是284。而284的所有真因子是1、2、4、71和142,它们的和是220。

要求小于给定数的所有亲密数对,我们可以先写一个函数来计算一个数的真因子之和,然后遍历给定数以下的每一个数,判断它是否有对应的亲密数对。

下面是完整的代码实现:

#include <stdio.h>

// 计算一个数的真因子之和
int sumOfProperDivisors(int num) {
    int sum = 1;
    for (int i = 2; i * i <= num; i++) {
      if (num % i == 0) {
            sum += i;
            if (i * i != num) {
                sum += num / i;
            }
      }
    }
    return sum;
}

int main() {
    int n;
    printf("请输入一个正整数:");
    scanf("%d", &n);

    printf("%d以下的亲密数对有:\n", n);
    for (int i = 1; i < n; i++) {
      int sum1 = sumOfProperDivisors(i);
      int sum2 = sumOfProperDivisors(sum1);
      if (sum2 == i && sum1 != i) {
            printf("%d %d\n", i, sum1);
      }
    }

    return 0;
}

以上的代码中,`sumOfProperDivisors`函数用来计算一个数的真因子之和。注意,在计算真因子之和时只需要遍历到平方根即可,这样可以节省很多时间。在主函数中,我们按顺序遍历小于给定数的每一个数,判断它是否有亲密数对,并打印出来。

希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-5-28 13:50:24

本帖最后由 jackz007 于 2024-5-28 14:36 编辑

#include <stdio.h>

/* 如果一个正整数 d 除本身 (d) 以外的所有因数之和为 e ,而 e
   除本身 (e) 以外的所有因数之和为 d,那么,称 d、e 为亲密数。*/

int foo(int d)
{
      int e , k                                              ;
      for(k = 1 , e = 2 ; e < d ; e ++) if(! (d % e)) k += e ;
      return k                                             ;
}

int main(void)
{
      int c , d , e , n                                    ;
      scanf("%d" , & n)                                    ;
      for(c = 0 , d = 2 ; d <= n ; d ++) {
                e = foo(d)                                     ;
                if(d > e && foo(e) == d) {
                        printf("%d %d\n" , e , d)            ;
                        c ++                                 ;
                }
      }
      if(! c) printf("not found.\n")                         ;
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
300
220 284

D:\\C>
页: [1]
查看完整版本: C语言亲密数求教!!!