可能是编译环境的问题,我在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;
}
}