回 帖 发 新 帖 刷新版面

主题:[讨论]帮忙修改下

若a,b为亲密数,则a的因子之和等于b,b的因子之和等于a,且a不等于b,例如220和284就是一对亲密数,通过编程输出6~5000内的所有亲密数。



#include <stdio.h>
#include <stdlib.h>

int main()
{
   int a,b=0,i,k,l=0;
   for(a=6;a<=5000;a++)
   {
       k=a;
       for(i=1;i<=k-1;i++)
       {
        if(k%i==0)
       b=b+i;
       }
       for(i=1;i<=b-1;i++)
       {
       if(b%i==0)
       l=l+i;
       }
       if(l==a)
       printf("%-10d%-10d\n",a,b);
       b=0;
       l=0;
   }
    return 0;
}


但是会输出这样的
220   284
后面又会有
284  220
我想把这样的去掉只要一组

回复列表 (共3个回复)

沙发

现在要熄灯了。明天帮楼主解决。

板凳

//若a,b为亲密数,则a的因子之和等于b,b的因子之和等于a,且a不等于b,
//例如220和284就是一对亲密数,通过编程输出6~5000内的所有亲密数。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a, b = 0, i, k, l = 0;
    for(a = 6; a <= 5000; a ++)
    {
        k = a;
        for(i = 1; i <= k - 1; i ++)
        {
            if(k % i == 0)
                b = b + i;
        }
        for(i = 1; i <= b - 1 && a <= b; i ++)//楼主请看应该明白什么意思吧。
        {
            if(b % i == 0)
                l = l + i;
        }
        if(l == a)
            printf("%-10d%-10d\n", a, b);
        b = 0;
        l = 0;
    }
    return 0;
}

3 楼

我把楼主的代码复制到VC6.0环境下运行,输出答案为:
6           6
28          28
220         284
284         220
496         496
1184        1210
1210        1184
2620        2924
2924        2620
我题目也没仔细看,以为楼主只是想把重复的只输一遍,所以提供了以上代码,后来题目一看,有点吓到了,a!=b,那6 6 ,28 28那二组不应该输出啊。
//若a,b为亲密数,则a的因子之和等于b,b的因子之和等于a,且a不等于b,
//例如220和284就是一对亲密数,通过编程输出6~5000内的所有亲密数。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a, b = 0, i, k, l = 0;
    for(a = 6; a <= 5000; a ++)
    {
        k = a;
        for(i = 1; i <= k - 1; i ++)
        {
            if(k % i == 0)
                b = b + i;
        }
        for(i = 1; i <= b - 1 && a < b; i ++)//不要等号,改为a < b
        {
            if(b % i == 0)
                l = l + i;
        }
        if(l == a)
            printf("%-10d%-10d\n", a, b);
        b = 0;
        l = 0;
    }
    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册