Marcccccy 发表于 2020-5-8 19:53:50

计算亲密数对

题目是这样子的:
计算亲密数对,若a,b为1对亲密数,则a的因子和等于b,b的因子和等于a, 且a不等于b。 如220、284是1对亲密数, 284,220也是1对亲密数。程序要求在6至5000内找出所有的亲密数对,并对每对亲密数用格式"%6d,%6d\n"输出。
答案给的代码是这样子的:
#include<stdio.h>
int main()
{
        int a,b,c,k;
        for(a=6;a<=5000;a++)
        {
                for(k=1,b=0;k<=a/2;k++)
                        if(a%k==0) b+=k;
                for(k=1,c=0;k<=b/2;k++)
                        if(b%k==0) c+=k;
                if(a==c&&a!=b)
                        printf("%6d,%6d\n",a,b);
        }
        return 0;
}
老实说,那个b和c可以从5开始嘛,从0开始会不会不太好{:10_299:}

aaron.yang 发表于 2020-5-8 21:34:26

沙发!

liuzhengyuan 发表于 2020-5-8 23:01:21

aaron.yang 发表于 2020-5-8 21:34
沙发!

Marcccccy 发表于 2020-5-9 23:39:50

{:10_259:}

skyddy 发表于 2020-5-10 12:28:57

本帖最后由 skyddy 于 2020-5-24 19:06 编辑

不能为5吧 b和c表示因子的和 每次大循环因子的和要置为0 重新计算的
我写的烂方法
int a, b;
    int divide;
    int sum;
    for (a = 6; a <= 5000; ++a) {
      sum = 0;
      for (int j = 1; j <= sqrt(a); ++j) {
            if (a % j == 0) {
                if (j != 1) {
                  divide = a / j;
                } else {
                  divide = 0;
                }
                sum += (j + divide);
            }
      }
      b = sum;
      sum = 0;
      for (int k = 1; k <= sqrt(b); ++k) {
            if (b % k == 0) {
                if (k != 1) {

                  divide = b / k;
                } else {
                  divide = 0;
                }
                sum += (k + divide);
            }
      }
      if (sum == a && a != b) {
            printf("%6d,%6d\n", a, b);
      }
    }
    return 0;

Marcccccy 发表于 2020-5-24 12:10:46

skyddy 发表于 2020-5-10 12:28
不能为5吧 b和c表示因子的和 每次大次循环因子的和要置为0 重新计算的
我写的烂方法

有道理{:10_272:}
页: [1]
查看完整版本: 计算亲密数对