C语言求互满数

如果有两个数,每一个数它的所有约数(除了它本身以外)的和正好等于对方,则称这两个数为互满数,求出 30000 以内所有的互满数, 并显示输出,求 一个数它的所有约数(除了它本身以外)的和用函数实现!

1楼写的那个函数不是计算一个数约数之后,而是计算不是约数之和的,不要混淆了;
有个解法,不过很耗时(相当耗时)
//环境: VC6.0; 运行平台: XPSP2
#include <iostream>
using namespace std;
int main()
{
int ysSum(int x);

for(int i=1;i<=30000;i++)
for(int j=i;j<=30000;j++)
{
if( ( ysSum(i)!=j ) || ( ysSum(j)!=i ))
continue;
else
cout<<i<<" "<<j<<endl;
}
return 0;
}

int ysSum(int x) //计算一个数的约数和
{
int sum=0;
for(int i=1;i<x;i++)
{
if(x%i==0) sum+=i;
}

return sum;
}
这个程序估计20分钟也算不完;

也有效率更好的算法:
#include <iostream>
using namespace std;
int main()
{
int ysSum(int x);
int temp;
for(int i=1;i<=30000;i++)

{
temp=ysSum(i); //计算i的约数和
if(temp>30000) //temp不能大于30000
continue;

if(ysSum(temp)==i) //如果temp的约数和等于i,
// 则是我们要的
cout<<i<<" "<<temp<<endl;
}
return 0;
}

int ysSum(int x)
{
int sum=0;
for(int i=1;i<x;i++)
{
if(x%i==0) sum+=i;
}

return sum;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-06-11
long sum(long a)
{
long i,sum=0;
for(i=1;i<a;i++)
if(a%i)sum+=i;
}本回答被提问者采纳