最后两个测试点无论如何通不过

在m到n内找出所有的亲密数对。

若a、b为1对亲密数,则a的因子和等于b、b的因子和等于a、且a不等于b。如:220、284是1对亲密数,则284、220也是1对亲密数。(一个数的因子不包含自己,但包含1)

输入格式:
两个数m和n。

输出格式:
每行两个数a,b,表示a和b是亲密数,且a<b;每行的第一个数按从小到大输出。两个数间用一个空格隔开。

输入样例:
18 299
输出样例:
在这里给出相应的输出。例如:

220 284
代码

#include <stdio.h>
#include <stdlib.h>
int main()
{ int a,b,m,n,k,q;
 int g[100000];
  q=0;
  k=0;
  scanf("%d %d",&a,&b);
  for(m=a;m<=b;m++)
  {
      for(n=1;n<m;n++)
      {
          if(m%n==0)
          {
              k=k+n;
          }
      }
      g[q]=k;
      k=0;
      q++;
  }
  for(m=0;m<q;m++)
  {
      for(n=a;n<=b;n++)
      {
          if(g[m]==n&&g[n-a]==m+a&&(m+a)!=n&&(m+a)<n)
          {
              printf("%d %d\n",m+a,n);
          }
      }
  }


    return 0;
}



img

你题目的解答代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a, b, m, n, k, q, t;
    q = 0;
    scanf("%d %d", &a, &b);
    int *g = (int *)malloc(sizeof(int)*(b+1));
    for (m = a; m <= b; m++)
    {
        k = 0;
        t = m / 2;
        for (n = 1; n <= t; n++)
        {
            if (m % n == 0)
            {
                k = k + n;
            }
        }
        g[m] = k;
    }
    for (m = a; m <= b; m++)
    {
        n = g[m];
        if (n>=a && n<m && g[n]==m)
            printf("%d %d\n", n, m);
    }
    return 0;
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

应该只需要遍历a到b之间每个数m,得到对应的k值后,看k是否在a到b之间,且大于m,然后再同样计算k值所有因子的和是否等于m就可以了

img

代码修改如下:


#include <stdio.h>
#include <stdlib.h>
int main()
{ 
    int a,b,m,n,k;
    int i,s;//修改
    
    k=0;
    scanf("%d %d",&a,&b);
    
    for(m=a;m<=b;m++)//修改3
    {
        for(n=1;n<m;n++)
        {
            if(m%n==0)
            {
                k=k+n;
            }
        }
        //计算k的因子是否等于m
        if( k>m && k<=b)
        {
            s=0;
            for(i=1;i<k;i++)
            {
                if(k%i==0)
                    s+=i;
            }
            if(s == m)
                printf("%d %d\n",m,k);
        }
        k=0;
    }
    
    return 0;
}

如有帮助,请点击我的回答下方的“采纳该答案”帮忙采纳一下,谢谢。

img

试试这样改:

#include <stdio.h>
#include <stdlib.h>
int g[100000];
int main()
{
    int a, b, m, n, k;
    scanf("%d %d", &a, &b);
    for (m = a; m <= b; m++)
    {
        for (n = 2, k = 1; n <= m / 2; n++) //修改
        {
            if (m % n == 0)
            {
                k = k + n;
            }
        }
        g[m] = k;
    }
    for (m = a; m < b;m++)//for (m = 0; m < q; m++)
    {
        for (n = m + 1; n <= b; n++)//for (n = a; n <= b; n++)
        {
            if (g[m] == n && g[n] == m)//if (g[m] == n && g[n - a] == m + a && (m + a) != n && (m + a) < n)
            {
                printf("%d %d\n", m, n);
            }
        }
    }
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632