鱼C论坛

 找回密码
 立即注册
查看: 589|回复: 2

C语言亲密数求教!!!

[复制链接]
发表于 2024-5-28 08:50:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

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

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

300
【样例输出】

220 284
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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。

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

下面是完整的代码实现:

  1. #include <stdio.h>

  2. // 计算一个数的真因子之和
  3. int sumOfProperDivisors(int num) {
  4.     int sum = 1;
  5.     for (int i = 2; i * i <= num; i++) {
  6.         if (num % i == 0) {
  7.             sum += i;
  8.             if (i * i != num) {
  9.                 sum += num / i;
  10.             }
  11.         }
  12.     }
  13.     return sum;
  14. }

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

  19.     printf("%d以下的亲密数对有:\n", n);
  20.     for (int i = 1; i < n; i++) {
  21.         int sum1 = sumOfProperDivisors(i);
  22.         int sum2 = sumOfProperDivisors(sum1);
  23.         if (sum2 == i && sum1 != i) {
  24.             printf("%d %d\n", i, sum1);
  25.         }
  26.     }

  27.     return 0;
  28. }
复制代码


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

希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-28 13:50:24 | 显示全部楼层
本帖最后由 jackz007 于 2024-5-28 14:36 编辑
  1. #include <stdio.h>

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

  4. int foo(int d)
  5. {
  6.         int e , k                                              ;
  7.         for(k = 1 , e = 2 ; e < d ; e ++) if(! (d % e)) k += e ;
  8.         return k                                               ;
  9. }

  10. int main(void)
  11. {
  12.         int c , d , e , n                                      ;
  13.         scanf("%d" , & n)                                      ;
  14.         for(c = 0 , d = 2 ; d <= n ; d ++) {
  15.                 e = foo(d)                                     ;
  16.                 if(d > e && foo(e) == d) {
  17.                         printf("%d %d\n" , e , d)              ;
  18.                         c ++                                   ;
  19.                 }
  20.         }
  21.         if(! c) printf("not found.\n")                         ;
  22. }
复制代码

        编译、运行实况:
  1. D:\[exercise]\C>g++ -o x x.c

  2. D:\[exercise]\C>x
  3. 300
  4. 220 284

  5. D:\[exercise]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-20 00:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表