| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 846 人关注过本帖
标题:关于亲和数
只看楼主 加入收藏
a99875984
Rank: 2
等 级:论坛游民
帖 子:188
专家分:24
注 册:2012-2-11
结帖率:94.64%
收藏
已结贴  问题点数:18 回复次数:3 
关于亲和数
程序代码:
#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;
            }
    }
}
请问为何输出的是
220 284
1184 1210
2000 1780  这最后个数据是怎么回事,谢谢
搜索更多相关主题的帖子: color 
2012-04-29 16:58
tongzhipeng
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:14
专家分:101
注 册:2012-5-1
收藏
得分:18 
可能是编译环境的问题,我在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;    
    }    
}
2012-05-02 14:40
a99875984
Rank: 2
等 级:论坛游民
帖 子:188
专家分:24
注 册:2012-2-11
收藏
得分:0 
回复 2楼 tongzhipeng
我也用了标准C++试过了,还是输出那个多余的数,我发现在主函数中int a,i,j;和int i,j,a;输出结果不同,前者会输出多余数据,后者不会,这是怎么回事啊?我有次提到一个问题,有人和我说C和C++一起用不是好习惯,这又是为什么啊?我觉得C的输出比C++简单点。
2012-05-02 23:09
tongzhipeng
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:14
专家分:101
注 册:2012-5-1
收藏
得分:0 
回复 3楼 a99875984
变量定义顺序会产生影响吗?这个我还真不知道。。。我也在刚学,我认为是没有影响的。
c和c++确实在没有必要的情况下还要混用,c++兼容了c里面的语法,但是写c++还是按c++的写法好,c++挺方便的,cout写起来比printf写起来方便多了,printf的引号啊,换行的反斜线,按起来多麻烦,呵呵,这个东西习惯就好了,c能做的事情c++都能做,要渐渐过渡过来,不要两个混在一起用。
2012-05-03 22:52
快速回复:关于亲和数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020882 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved