广陵伞 发表于 2021-9-8 20:22:29

毕达哥拉斯相亲数,相关程序求助

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

#include <stdio.h>
/* 相亲数枚举,四位以内,并列出因数和的计算式
   定义:两数所有因数之和恰等于彼此*/
int factor(int a)//factor函数,对参数a进行求和,返回所求和fsum
{
      int fi = 1, fsum = 0;
      while(fi < a)
      {
                if(a / fi == 0) fsum = fsum + fi;
      }
      return fsum;
}
void pfactor(int a)//pfactor函数,按照题目格式输出真因数求和计算表达式
{
      printf("%d 的真因数之和为:");
      int i = 1, sum = 0;
      while(i < a)
      {
                if(a / i == 0)
                {
                        printf("%d", i);
                        sum = sum + i;
                }
      }
      printf("=%d\n", sum);
}
int main()
{
      int n = 1, sum = 0;
      while(n < 10000)
      {
                sum = factor(n);
                if (factor(sum) == n) //两次factor函数后与本身等,n和sum为相亲数
                {
                        printf("相亲数:%d,%d\n", sum, n);
                        pfactor(n);
                        pfactor(sum);
                }
                n++;
      }
      return 0;
}

blahblahfc 发表于 2021-9-8 20:22:30

供参考:
#include <stdio.h>
/* 相亲数枚举,四位以内,并列出因数和的计算式
   定义:两数所有因数之和恰等于彼此*/
int factor(int a)//factor函数,对参数a进行求和,返回所求和fsum
{
      int fi = 1, fsum = 0;
      while(fi < a)
      {
                // if(a / fi == 0) fsum = fsum + fi;
                if(a % fi == 0) fsum = fsum + fi; // 整除
                fi++; // 否则死循环
      }
      return fsum;
}
void pfactor(int a)//pfactor函数,按照题目格式输出真因数求和计算表达式
{
      // printf("%d 的真因数之和为:");
      printf("%d 的真因数之和为:", a); // 少了变量
      int i = 1, sum = 0;
      printf("1");
      while(i < a)
      {
                // if(a / i == 0)
                if(a % i == 0) // 整除
                {
                        // printf("%d", i);
                        if (i!=1) {
                              printf("+%d", i);
                        }
                        sum = sum + i;
                }
                i++; // 否则死循环
      }
      printf("=%d\n", sum);
}
int main()
{
      int n = 1, sum = 0;
      while(n < 10000)
      {
                sum = factor(n);
                // if (factor(sum) == n) //两次factor函数后与本身等,n和sum为相亲数
                if (sum>n && factor(sum) == n) //两次factor函数后与本身等,n和sum为相亲数
                {
                        // printf("相亲数:%d,%d\n", sum, n);
                        printf("相亲数:%d,%d\n", n, sum); // 换位置符合题目顺序
                        pfactor(n);
                        pfactor(sum);
                }
                n++;
      }
      return 0;
}

人造人 发表于 2021-9-8 21:40:24

错误的地方太多了,你对照我写的程序,看你错了多少
#include <stdio.h>
#include <stdbool.h>

size_t proper_divisor_sum(size_t n, bool print) {
    size_t sum = 0;
    const char *op = "";
    if(print) printf("%lu 的真因数之和为: ", n);
    for(size_t i = 1; i < n; ++i) {
      if(n % i == 0) {
            sum += i;
            if(print) {
                printf("%s%lu", op, i);
                op = "+";
            }
      }
    }
    if(print) printf("=%lu\n", sum);
    return sum;
}

int main(void) {
    size_t skip, index = 0;
    for(size_t i = 1; i < 10000; ++i) {
      bool flag = true;
      for(size_t j = 0; j < index; ++j) {
            if(skip == i) {flag = false; break;}
      }
      if(flag != true) continue;
      size_t sum = proper_divisor_sum(i, false);
      if(proper_divisor_sum(sum, false) == i && sum != i) {
            skip = sum;
            printf("相亲数:%lu,%lu\n", i, sum);
            proper_divisor_sum(i, true);
            proper_divisor_sum(sum, true);
      }
    }
    return 0;
}

17839241522 发表于 2021-9-9 14:25:34

{:10_266:}
页: [1]
查看完整版本: 毕达哥拉斯相亲数,相关程序求助