![]() |
#2
tongzhipeng2012-05-02 14:40
可能是编译环境的问题,我在ubuntu 下用gcc编译器 测试过你的代码,没有最后那个不正确的2000 1780这个结果
因为,你用的好像不是标准C++吧,是vc还是什么,我测试的时候稍微修改了头文件的写法 ![]() #include <iostream> #include <iomanip> #include <math.h> using namespace std; int yueshu(int b)//求约数和 { int i=0,a=0,c; for(c=1;c<=b/2;c++) { if(b%c==0) { a+=c; } } return a; } int main() { int a=0,i,j; int y[2000]; for(i=0;i<=2000;i++) { //x[i]=i; y[i]=yueshu(i); } for(i=0;i<=2000;i++) for(j=0;j<=2000;j++) { if(i==y[j]&&j==y[i]&&i!=j) { if(a!=i) cout<<i<<"和"<<j<<"是一对亲和数"<<endl; a=j; } } } 运行结果为 220和284是一对亲和数 1184和1210是一对亲和数 另外这段代码效率上略有不足,如果计算比较多数字的时候可能很慢,主要是2层循环的设计不好 这样每次计算一个数是否为亲和数时,都要从1一直到找到亲和数,而没有亲和数的数会一直找到最后,也就是2000,如果找20W个呢,就会一直找到20W 不过因为编译器进行了优化,实际运行时效率不会慢太多 以下代码对效率进行了更改,参考一下 ![]() #include <iostream> #include <math.h> using namespace std; int sum_fac(int n) { int i,sum=0,cnt=0;//cnt用来计算因子数 for(i=1;i<=n/2;i++) { if(i>sqrt(n) && cnt<2) return 1;//质数 只有一个真因子1,真因子之和即为1 if(n%i==0) { sum+=i; cnt++; } } return sum; } int main(void) { cout << "本程序计算1到200000的所有亲和数" << endl; int i; for(i=0; i<200001; i++) { int a=sum_fac(i); int b=sum_fac(a); if(a>i && b==i)//一对 亲和数必定有一大一小,为防止重复计算 ,使用a>i条件过滤 cout << "( " << i << ", " << a << " )" << endl; } } |

#include <iostream.h>
#include <iomanip.h>
#include <math.h>
int yueshu(int b)//求约数和
{
int i=0,a=0,c;
for(c=1;c<=b/2;c++)
{
if(b%c==0)
{
a+=c;
}
}
return a;
}
void main()
{
int a=0,i,j;
int y[2000];
for(i=0;i<=2000;i++)
{
//x[i]=i;
y[i]=yueshu(i);
}
for(i=0;i<=2000;i++)
for(j=0;j<=2000;j++)
{
if(i==y[j]&&j==y[i]&&i!=j)
{
if(a!=i)
cout<<i<<"和"<<j<<"是一对亲和数"<<endl;
a=j;
}
}
}
请问为何输出的是#include <iomanip.h>
#include <math.h>
int yueshu(int b)//求约数和
{
int i=0,a=0,c;
for(c=1;c<=b/2;c++)
{
if(b%c==0)
{
a+=c;
}
}
return a;
}
void main()
{
int a=0,i,j;
int y[2000];
for(i=0;i<=2000;i++)
{
//x[i]=i;
y[i]=yueshu(i);
}
for(i=0;i<=2000;i++)
for(j=0;j<=2000;j++)
{
if(i==y[j]&&j==y[i]&&i!=j)
{
if(a!=i)
cout<<i<<"和"<<j<<"是一对亲和数"<<endl;
a=j;
}
}
}
220 284
1184 1210
2000 1780 这最后个数据是怎么回事,谢谢