求助:求亲密数对问题
代码如下://求1000以内的亲密数对,亲密数对的定义为:若正整数A的所有因子(不包括A)之和
//为B,B的所有因子(不包括B)之和为A,且A!=B,则称A与B为亲密数对。
//如:220的因子之和 1+2+4+....+110=284
// 284的因子之和 1+2+....+142=220
#include "stdafx.h"
#include "iostream.h"
void main()
{
int x,y;
int i,j;
int sum1=0,sum2=0;
for(x=1;x<=1000;x++)
{
for(i=1;i<x;i++)
{
if(x%i==0)
sum1+=i;
}
for(y=1;y<=1000;y++)
{
for(j=1;j<y;j++)
{
if(y%j==0)
sum2+=j;
}
if(x==sum2 && y==sum1 && x!=y)
cout<<x<<"和"<<y<<"是亲密对数"<<endl;
}
}
}
请问错在了哪里?
----------------解决方案--------------------------------------------------------
不知道。。。
[color=white]
----------------解决方案--------------------------------------------------------
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
#include <iostream>
using namespace std;
unsigned Sqrt(unsigned n)
{
#define LOWER_POS(x) for(;nl<nr;nm=(nl+nr+1)>>1)\
if((x)>n)nr=nm-1;else nl=nm;
unsigned nl=0, nr=31, nm=15;
LOWER_POS(1u<<nm);
nm=n>>(nm>>1); nl=nm>>1;nr=nm+nl;
LOWER_POS(nm*nm);
#undef LOWER_POS
return nm;
}
unsigned SumOfDivisor(unsigned n)
{
unsigned e=Sqrt(n+1),s=0,t=2;
for(;t<e;++t)
if(n%t==0) s+=t+n/t;
if(n%t==0) s+=t;
return s+1;
}
int main()
{
for(unsigned x=1;x<=10000;x++)
{
unsigned x1=SumOfDivisor(x);
if(x<x1 && SumOfDivisor(x1)==x)
{
cout<<x<<' '<<x1<<endl;
}
}
return 0;
}
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
#include <iostream>
using namespace std;
unsigned Sqrt(unsigned n)
{
#define LOWER_POS(x) for(;nl<nr;nm=(nl+nr+1)>>1)\
if((x)>n)nr=nm-1;else nl=nm;
unsigned nl=0, nr=31, nm=15;
LOWER_POS(1u<<nm);
nm=n>>(nm>>1); nl=nm>>1;nr=nm+nl;
LOWER_POS(nm*nm);
#undef LOWER_POS
return nm;
}
unsigned SumOfDivisor(unsigned n)
{
unsigned e=Sqrt(n+1),s=0,t=2;
for(;t<e;++t)
if(n%t==0) s+=t+n/t;
if(n%t==0) s+=t;
return s+1;
}
int main()
{
for(unsigned x=1;x<=10000;x++)
{
unsigned x1=SumOfDivisor(x);
if(x<x1 && SumOfDivisor(x1)==x)
{
cout<<x<<' '<<x1<<endl;
}
}
return 0;
}
重新写一个我会
[color=white]
[[it] 本帖最后由 Loli 于 2008-6-15 17:09 编辑 [/it]]
----------------解决方案--------------------------------------------------------
可我就想知道我这个错在了哪里?
编译能通过,算法好像也行得通,值也肯定有,可怎么....
?????
----------------解决方案--------------------------------------------------------
显然,每次循环时,sum1,sum2没有置0,
改了的代码如下:#include "iostream.h"
int main()
{
int x,y;
int i,j;
int sum1=0,sum2=0;
for(x=1;x<=1000;x++)
{
sum1=0;
for(i=1;i<x;i++)
{
if(x%i==0)
sum1+=i;
}
for(y=1;y<=1000;y++)
{
sum2=0;
for(j=1;j<y;j++)
{
if(y%j==0)
sum2+=j;
}
if(x==sum2 && y==sum1 && x!=y)
cout<<x<<"和"<<y<<"是亲密对数"<<endl;
}
}
}
...缩进真不好...不想手工改了...
----------------解决方案--------------------------------------------------------