鱼C论坛

 找回密码
 立即注册
查看: 2015|回复: 3

[已解决]毕达哥拉斯相亲数,相关程序求助

[复制链接]
发表于 2021-9-8 20:22:29 | 显示全部楼层 |阅读模式
30鱼币
附上题目要求以及自己的问题程序
  1. 2500年前数学大师毕达哥拉斯就发现,220与284两数之间存在着奇妙的联系:
  2. 220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284
  3. 284的真因数之和为:1+2+4+71+142=220
  4. 毕达哥拉斯吧这样的数对A,B称为相亲数:A的真因数之和为B,而B的真因数之和为A。设计程序求4位以内的相亲数。
  5. **输出格式要求:"相亲数:%d,%d\n"  "%d 的真因数之和为:%d"  "+%d"  "=%d\n"
  6. 程序运行示例如下:
  7. 相亲数:220,284
  8. 220 的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284
  9. 284 的真因数之和为:1+2+4+71+142=220
  10. 相亲数:1184,1210
  11. 1184 的真因数之和为:1+2+4+8+16+32+37+74+148+296+592=1210
  12. 1210 的真因数之和为:1+2+5+10+11+22+55+110+121+242+605=1184
  13. 相亲数:2620,2924
  14. 2620 的真因数之和为:1+2+4+5+10+20+131+262+524+655+1310=2924
  15. 2924 的真因数之和为:1+2+4+17+34+43+68+86+172+731+1462=2620
  16. 相亲数:5020,5564
  17. 5020 的真因数之和为:1+2+4+5+10+20+251+502+1004+1255+2510=5564
  18. 5564 的真因数之和为:1+2+4+13+26+52+107+214+428+1391+2782=5020
  19. 相亲数:6232,6368
  20. 6232 的真因数之和为:1+2+4+8+19+38+41+76+82+152+164+328+779+1558+3116=6368
  21. 6368 的真因数之和为:1+2+4+8+16+32+199+398+796+1592+3184=6232
复制代码

  1. #include <stdio.h>
  2. /* 相亲数枚举,四位以内,并列出因数和的计算式
  3.    定义:两数所有因数之和恰等于彼此*/
  4. int factor(int a)  //factor函数,对参数a进行求和,返回所求和fsum
  5. {
  6.         int fi = 1, fsum = 0;
  7.         while(fi < a)
  8.         {
  9.                 if(a / fi == 0) fsum = fsum + fi;
  10.         }
  11.         return fsum;
  12. }
  13. void pfactor(int a)  //pfactor函数,按照题目格式输出真因数求和计算表达式
  14. {
  15.         printf("%d 的真因数之和为:");
  16.         int i = 1, sum = 0;
  17.         while(i < a)
  18.         {
  19.                 if(a / i == 0)
  20.                 {
  21.                         printf("%d", i);
  22.                         sum = sum + i;
  23.                 }
  24.         }
  25.         printf("=%d\n", sum);
  26. }
  27. int main()
  28. {
  29.         int n = 1, sum = 0;
  30.         while(n < 10000)
  31.         {
  32.                 sum = factor(n);
  33.                 if (factor(sum) == n) //两次factor函数后与本身等,n和sum为相亲数
  34.                 {
  35.                         printf("相亲数:%d,%d\n", sum, n);
  36.                         pfactor(n);
  37.                         pfactor(sum);
  38.                 }
  39.                 n++;
  40.         }
  41.         return 0;
  42. }
复制代码
最佳答案
2021-9-8 20:22:30
供参考:
  1. #include <stdio.h>
  2. /* 相亲数枚举,四位以内,并列出因数和的计算式
  3.    定义:两数所有因数之和恰等于彼此*/
  4. int factor(int a)  //factor函数,对参数a进行求和,返回所求和fsum
  5. {
  6.         int fi = 1, fsum = 0;
  7.         while(fi < a)
  8.         {
  9.                 // if(a / fi == 0) fsum = fsum + fi;
  10.                 if(a % fi == 0) fsum = fsum + fi; // 整除
  11.                 fi++; // 否则死循环
  12.         }
  13.         return fsum;
  14. }
  15. void pfactor(int a)  //pfactor函数,按照题目格式输出真因数求和计算表达式
  16. {
  17.         // printf("%d 的真因数之和为:");
  18.         printf("%d 的真因数之和为:", a); // 少了变量
  19.         int i = 1, sum = 0;
  20.         printf("1");
  21.         while(i < a)
  22.         {
  23.                 // if(a / i == 0)
  24.                 if(a % i == 0) // 整除
  25.                 {
  26.                         // printf("%d", i);
  27.                         if (i!=1) {
  28.                                 printf("+%d", i);
  29.                         }
  30.                         sum = sum + i;
  31.                 }
  32.                 i++; // 否则死循环
  33.         }
  34.         printf("=%d\n", sum);
  35. }
  36. int main()
  37. {
  38.         int n = 1, sum = 0;
  39.         while(n < 10000)
  40.         {
  41.                 sum = factor(n);
  42.                 // if (factor(sum) == n) //两次factor函数后与本身等,n和sum为相亲数
  43.                 if (sum>n && factor(sum) == n) //两次factor函数后与本身等,n和sum为相亲数
  44.                 {
  45.                         // printf("相亲数:%d,%d\n", sum, n);
  46.                         printf("相亲数:%d,%d\n", n, sum); // 换位置符合题目顺序
  47.                         pfactor(n);
  48.                         pfactor(sum);
  49.                 }
  50.                 n++;
  51.         }
  52.         return 0;
  53. }
复制代码

最佳答案

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

使用道具 举报

发表于 2021-9-8 20:22:30 | 显示全部楼层    本楼为最佳答案   
供参考:
  1. #include <stdio.h>
  2. /* 相亲数枚举,四位以内,并列出因数和的计算式
  3.    定义:两数所有因数之和恰等于彼此*/
  4. int factor(int a)  //factor函数,对参数a进行求和,返回所求和fsum
  5. {
  6.         int fi = 1, fsum = 0;
  7.         while(fi < a)
  8.         {
  9.                 // if(a / fi == 0) fsum = fsum + fi;
  10.                 if(a % fi == 0) fsum = fsum + fi; // 整除
  11.                 fi++; // 否则死循环
  12.         }
  13.         return fsum;
  14. }
  15. void pfactor(int a)  //pfactor函数,按照题目格式输出真因数求和计算表达式
  16. {
  17.         // printf("%d 的真因数之和为:");
  18.         printf("%d 的真因数之和为:", a); // 少了变量
  19.         int i = 1, sum = 0;
  20.         printf("1");
  21.         while(i < a)
  22.         {
  23.                 // if(a / i == 0)
  24.                 if(a % i == 0) // 整除
  25.                 {
  26.                         // printf("%d", i);
  27.                         if (i!=1) {
  28.                                 printf("+%d", i);
  29.                         }
  30.                         sum = sum + i;
  31.                 }
  32.                 i++; // 否则死循环
  33.         }
  34.         printf("=%d\n", sum);
  35. }
  36. int main()
  37. {
  38.         int n = 1, sum = 0;
  39.         while(n < 10000)
  40.         {
  41.                 sum = factor(n);
  42.                 // if (factor(sum) == n) //两次factor函数后与本身等,n和sum为相亲数
  43.                 if (sum>n && factor(sum) == n) //两次factor函数后与本身等,n和sum为相亲数
  44.                 {
  45.                         // printf("相亲数:%d,%d\n", sum, n);
  46.                         printf("相亲数:%d,%d\n", n, sum); // 换位置符合题目顺序
  47.                         pfactor(n);
  48.                         pfactor(sum);
  49.                 }
  50.                 n++;
  51.         }
  52.         return 0;
  53. }
复制代码

评分

参与人数 1贡献 +3 收起 理由
广陵伞 + 3 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2021-9-8 21:40:24 | 显示全部楼层
错误的地方太多了,你对照我写的程序,看你错了多少
  1. #include <stdio.h>
  2. #include <stdbool.h>

  3. size_t proper_divisor_sum(size_t n, bool print) {
  4.     size_t sum = 0;
  5.     const char *op = "";
  6.     if(print) printf("%lu 的真因数之和为: ", n);
  7.     for(size_t i = 1; i < n; ++i) {
  8.         if(n % i == 0) {
  9.             sum += i;
  10.             if(print) {
  11.                 printf("%s%lu", op, i);
  12.                 op = "+";
  13.             }
  14.         }
  15.     }
  16.     if(print) printf("=%lu\n", sum);
  17.     return sum;
  18. }

  19. int main(void) {
  20.     size_t skip[100], index = 0;
  21.     for(size_t i = 1; i < 10000; ++i) {
  22.         bool flag = true;
  23.         for(size_t j = 0; j < index; ++j) {
  24.             if(skip[j] == i) {flag = false; break;}
  25.         }
  26.         if(flag != true) continue;
  27.         size_t sum = proper_divisor_sum(i, false);
  28.         if(proper_divisor_sum(sum, false) == i && sum != i) {
  29.             skip[index++] = sum;
  30.             printf("相亲数:%lu,%lu\n", i, sum);
  31.             proper_divisor_sum(i, true);
  32.             proper_divisor_sum(sum, true);
  33.         }
  34.     }
  35.     return 0;
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-9 14:25:34 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 14:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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