当前位置: 代码迷 >> C语言 >> the problem i don`t understand
  详细解决方案

the problem i don`t understand

热度:690   发布时间:2006-12-01 20:37:36.0
the problem i don`t understand

如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。编程,输出3000以内的全部亲密数。
以下是我的程序,不过,运行后,不出现任何结果。不是很明白/
main()
{ int i,j,m,n,sum1=0,sum2=0;
for(i=1;i<=3000;i++)
{for(j=1;j<=3000;j++)
{m=2;
while(m<=i)
{if(i%m==0)
sum1+=i/m;
m++;
}
n=2;
while(n<=j)
{if(j%n==0)
sum2+=j/n;
n++;
}
if((sum1==j)&&(sum2==i))
printf("%d %d",i,j);
}
}
getch();

}

[此贴子已经被作者于2006-12-1 20:37:56编辑过]

搜索更多相关的解决方案: problem  understand  don  

----------------解决方案--------------------------------------------------------

我也试着编了一下,在小范围内(如100以内),这种算法还是能够解决的,但是3000以内,就慢的很了。应该还有好的算法。
#include<stdio.h>
#include<math.h>
#define N 100
void main()
{
int sumA=0 ,sumB=0;

for(int i=3;i<=N;i++)
{
for(int j=3;j<N;j++)
{
sumA=0; sumB=0;
for(int i1=2;i1<i;i1++)// i 的因数的和
if(i%i1==0) sumA+=i1;

for(int i2=2;i2<j;i2++) // j的因数的和
if(j%i2==0) sumB+=i2;

if(sumA==j && sumB==i) printf("%d,",i);
}

}
}


----------------解决方案--------------------------------------------------------
忘了说了,1楼的:在求每个数的因数的和时,sum要恢复为0才可以,要不然sum会一直加下去,sum1 和sum2当然不会相等,因此没有结果输出。
----------------解决方案--------------------------------------------------------

你编的这个程序效率十分低,况且你在开始sum1=0,sum2=0,但你的程序j每次变化以后,sum1和sum2没有恢复到0,着就肯定有问题了.看看这个 是不是比你的效率高一些:
# include <stdio.h>
int f(int n)
{ int s,k;
for(k=2,s=1;k<=n/2;k++)
if(n%k==0) s=s+k;
return s;
}
void main()
{
int m,p,q;
for(m=2;m<=3000;m++)
{
p=f(m);
q=f(p);
if(q==m&&m<p)
printf("%d<--->%d\n",m,p);
}
}


----------------解决方案--------------------------------------------------------

根据楼主的意思,我也编了一个.

#include<stdio.h>

long sum(long num)//这个函数的效率还可以提高一点的.
{
long i=1,sum=0;
while(i<num)//
{
if(num%i==0)
{
sum+=i;//这个再加个sum+=num/i;当然循环变量里会缩短.
}
i++;
}
return sum;
}

int main()
{
long i=2;
while(i<=3000)
{
if(sum(sum(i))==i)
{
printf("%ld\n",i);
}
i++;
}
return 0;
}


----------------解决方案--------------------------------------------------------

楼上的 你的程序一点层次都没有 这样不好看呢 而且你自己运行下 好像也不太对哦
看看我的 不过效率好像也不高

#include<stdio.h>
main()
{ int i,j,m,n,sum1=0,sum2=0;
for(i=1;i<=3000;i++)
{
m=2;
while(m<=i)
{if(i%m==0)
sum1+=i/m;
m++;
}
for(j=1;j<i;j++)
{
n=2;
while(n<=j)
{if(j%n==0)
sum2+=j/n;
n++;
}

if((sum1==j)&&(sum2==i))
printf("%d %d",i,j);

sum2=0;
}
sum1=0;
}
}


----------------解决方案--------------------------------------------------------
4楼和5楼的最好了,
看来函数的调用以后还要多用!
多谢了!!
----------------解决方案--------------------------------------------------------
不过5楼的运行目的,和题目要求的不是很一样了。你是输出了一个完数。
而并非题目中的要求。
4搂的不错。
----------------解决方案--------------------------------------------------------
以下是引用science在2006-12-1 22:21:44的发言:
不过5楼的运行目的,和题目要求的不是很一样了。你是输出了一个完数
而并非题目中的要求。
4搂的不错。

麻烦你先运行检验一下好不好.
220 --->1+2+110+4+55+5+44+10+22+11+20=284--->1+2+142+4+71=220

我只是没有把两个数都输出.
if(sum(sum(i))==i)

一次做sum(i)是表示i的所有在[1,i)区间内的因子之和,假设等于j.
第二次sum(j)表示j的所有在[1,j)区间内的因子之和.假设等于k.

这里如果k==i,就说明i和k是亲密数.此时不就是sum(sum(i))和i是亲密数了.


----------------解决方案--------------------------------------------------------
  相关解决方案