在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;
}
你题目的解答代码如下:
#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;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
应该只需要遍历a到b之间每个数m,得到对应的k值后,看k是否在a到b之间,且大于m,然后再同样计算k值所有因子的和是否等于m就可以了
代码修改如下:
#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;
}
如有帮助,请点击我的回答下方的“采纳该答案”帮忙采纳一下,谢谢。
试试这样改:
#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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!