鱼C论坛

 找回密码
 立即注册
查看: 276|回复: 7

[已解决]亲密数问题:我这个为什么出不了结果

[复制链接]
发表于 2025-2-25 17:34:06 | 显示全部楼层 |阅读模式

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

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

x
两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。
#include<stdio.h>
int main()
{
  int same(int c);
  int a,b;
  for(a=2;a<3000;a++)
          for(b=3;b<=3000;b++)
          {
         while(same(a)==b&&same(b)==a&&b>a)
                         printf("(%d,%d)  ",a,b);
          }
return 0;
}
int same(int c)
{
  int n,m=0;
  for(n=1;n<c;n++)
  {
    while(c%n==0)
                m=m+n;
  }
  return m;
}
最佳答案
2025-2-25 20:52:28
本帖最后由 jackz007 于 2025-2-25 21:21 编辑

        楼主最大的问题是没有搞清楚 if 与 while 的区别,if 是条件判断,而 while 是循环。前者根据布尔表达式的值控制程序运行的走向,后者会根据布尔表达式的值决定是否继续循环。楼主就是在代码中 2 处本来应该使用 if 的地方错用了 while,导致程序陷入死循环,从而无法看到运行结果。
  1. #include<stdio.h>

  2. int same(int c)                                                           // 函数前置,调用前不必声明
  3. {
  4.         int n , m = 0                                                   ;
  5.         for(n = 1 ; n < c ; n ++) {
  6.                 if(c % n == 0) m = m + n                                ; // 这里有错,不可以用 while,肯定会死循环
  7.         }
  8.         return m                                                        ;
  9. }

  10. int main(void)                                                            // main() 函数放到最后,可以最大限度避免函数声明
  11. {
  12.         int a , b                                                       ;
  13.         for(a = 2 ; a < 3000 ; a ++) {                                    // 单层循环驱动即可,不可以用双层循环嵌套
  14.                 b = same(a)                                             ; // 函数定义已经前置,调用前不必进行声明
  15.                 if(a < b && same(b) == a) printf("%4d , %4d\n" , a , b) ; // 这里有错,不可以用 while,肯定会死循环
  16.         }
  17.         return 0                                                        ;
  18. }
复制代码

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

  2. D:\[exercise]\C>x
  3. 220 ,  284
  4. 1184 , 1210
  5. 2620 , 2924

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

使用道具 举报

发表于 2025-2-25 17:34:18 | 显示全部楼层
看起来你的代码有些不完整。让我给你一个完整的解决方案,这个程序将会找出3000以内的所有亲密数。

  1. #include <stdio.h>

  2. int sum_of_divisors(int n);

  3. int main() {
  4.     int a, b;
  5.     for (a = 2; a < 3000; a++) {
  6.         b = sum_of_divisors(a);
  7.         if (b > a && sum_of_divisors(b) == a) { // 合数需要满足 b > a 来避免重复的对比和输出
  8.             printf("%d 和 %d 是亲密数\n", a, b);
  9.         }
  10.     }
  11.     return 0;
  12. }

  13. int sum_of_divisors(int n) {
  14.     int sum = 1; // 1 是所有数的因子
  15.     for (int i = 2; i <= n / 2; i++) {
  16.         if (n % i == 0) {
  17.             sum += i;
  18.         }
  19.     }
  20.     return sum;
  21. }
复制代码


这个程序检查从2到3000的每个整数 a。对于每个 a,计算它的因子之和 b,并再次验证 b 的因子之和是否等于 a。只有当这两个条件都满足时,它们才是亲密数。

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

使用道具 举报

 楼主| 发表于 2025-2-25 18:50:17 | 显示全部楼层
我的哪些地方错了,请指出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-25 18:50:48 | 显示全部楼层
wsb1991abc 发表于 2025-02-25 18:50
我的哪些地方错了,请指出来


当然,这里是对你代码的一些修正和解释:

1. 你的代码不完整,缺少标准输入输出头文件和部分逻辑。
2. 你的 for 循环没有结束。

以下是一个完整的示例代码,可以求出3000以内的全部亲密数:


  1. #include <stdio.h>

  2. // 计算一个数的所有因子的和(包括1,但不包括它本身)
  3. int sum_of_divisors(int n) {
  4.     int sum = 1; // 1 是所有数的因子
  5.     for (int i = 2; i <= n / 2; i++) {
  6.         if (n % i == 0) {
  7.             sum += i;
  8.         }
  9.     }
  10.     return sum;
  11. }

  12. int main() {
  13.     int a, b;
  14.     for (a = 2; a < 3000; a++) {
  15.         b = sum_of_divisors(a);
  16.         // 防止重复输出同一组亲密数,例如 (220, 284) 和 (284, 220)
  17.         if (b > a && b < 3000 && sum_of_divisors(b) == a) {
  18.             printf("%d 和 %d 是亲密数\n", a, b);
  19.         }
  20.     }
  21.     return 0;
  22. }
复制代码


这个示例代码中:
- sum_of_divisors 函数用来计算一个数所有因子的和(包括1,但不包括它本身)。
- 在主函数中,通过两重 for 循环找出所有满足条件的数。
- 检查 b > a 来避免重复输出同一组亲密数。

希望这些修改能帮助你理解并解决你的问题。

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

使用道具 举报

发表于 2025-2-25 20:52:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2025-2-25 21:21 编辑

        楼主最大的问题是没有搞清楚 if 与 while 的区别,if 是条件判断,而 while 是循环。前者根据布尔表达式的值控制程序运行的走向,后者会根据布尔表达式的值决定是否继续循环。楼主就是在代码中 2 处本来应该使用 if 的地方错用了 while,导致程序陷入死循环,从而无法看到运行结果。
  1. #include<stdio.h>

  2. int same(int c)                                                           // 函数前置,调用前不必声明
  3. {
  4.         int n , m = 0                                                   ;
  5.         for(n = 1 ; n < c ; n ++) {
  6.                 if(c % n == 0) m = m + n                                ; // 这里有错,不可以用 while,肯定会死循环
  7.         }
  8.         return m                                                        ;
  9. }

  10. int main(void)                                                            // main() 函数放到最后,可以最大限度避免函数声明
  11. {
  12.         int a , b                                                       ;
  13.         for(a = 2 ; a < 3000 ; a ++) {                                    // 单层循环驱动即可,不可以用双层循环嵌套
  14.                 b = same(a)                                             ; // 函数定义已经前置,调用前不必进行声明
  15.                 if(a < b && same(b) == a) printf("%4d , %4d\n" , a , b) ; // 这里有错,不可以用 while,肯定会死循环
  16.         }
  17.         return 0                                                        ;
  18. }
复制代码

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

  2. D:\[exercise]\C>x
  3. 220 ,  284
  4. 1184 , 1210
  5. 2620 , 2924

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

使用道具 举报

 楼主| 发表于 2025-2-25 21:12:16 | 显示全部楼层
为什么不能用双层嵌套,是逻辑的问题吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-25 21:18:03 | 显示全部楼层
wsb1991abc 发表于 2025-2-25 21:12
为什么不能用双层嵌套,是逻辑的问题吗

          为什么要用双层循环嵌套,你懂自变量和因变量的关系吗,a 和 b 是互为因果的两个变量,它们是一对关联变量,又不是两个彼此独立的无关变量,所以,完全没必要使用双层循环。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-25 21:36:25 | 显示全部楼层
可以用双层嵌套,就是运行时间较长一些,效率不高面已,谢谢大神的解答
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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