注册 登录
编程论坛 C++教室

1000 以内完数 请各位帮忙简化算法

a874695162 发布于 2014-07-22 20:21, 793 次点击
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{   cout<<"1000以内的完数如下:"<<endl;
    int a,b,i;
    int t;
    for(a=2;a<=1000;a++)
    {t=0;
        for(b=1;b<a;b++)
            if(a%b==0)t=t+b;
    if(t==a)
    {cout<<a<<":";
    cout<<"它的因数是:"<<" ";
     for(b=1;b<a;b++)
       if(a%b==0)cout<<b<<" ";
     cout<<endl;
    }
    }
return 0;
    }
9 回复
#2
wp2319572014-07-23 08:35
你这个代码是完整的吗  完数在哪里
#3
韶志2014-07-23 08:57
不错啊  你已经写出来了,不需要简化了吧
#4
i802862014-07-23 13:37
算法上是可以简化一些,我也写了一个(头文件略),你比较一下:
void perfect_number(int &number)
{
    vector<int> NUM;
    for (int i = 2; i <= number; i++)
    {
        int SUM = 0;
        NUM.clear();
        for (int j = 1; j <i/2; j++)
        {
            if ((i%j == 0)&& (i/j>j))
            {
                NUM.push_back(j);
                if (j != 1 )
                    NUM.push_back(i/j);
            }
        }
        for (vector<int>::iterator iter = NUM.begin(); iter != NUM.end(); iter++)
        {
            SUM += (*iter);
        }
        if (SUM == i)
        {
            sort(NUM.begin(),NUM.end());
            cout << i << "的因式包括:";
            for (vector<int>::iterator iter = NUM.begin(); iter != NUM.end(); iter++)
                cout << (*iter) << "  ";
            cout << endl;
        }
    }
}

int main()
{
    int number;
    cin >> number;
    if (number>2)
        perfect_number(number);
    system("pause");
    return 0;
}
#5
a8746951622014-07-24 06:07
回复 2 楼 wp231957
输出的a即完数
#6
午夜小学徒2014-08-02 15:52
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。
例如: 第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。第三个完全数是496,有约数1、2、4、8、16、31、62、124、248、496,除去其本身496外,其余9个数相加,1+2+4+8+16+31+62+124+248=496。后面的完全数还有8128、33550336等等。
#7
午夜小学徒2014-08-02 15:56
你自己看看啊,你的i没有用啊,而且少输入了:8128!!!
#8
午夜小学徒2014-08-02 15:57
坑了,还以为是10000呢
#9
午夜小学徒2014-08-02 15:57
可以利用一下 宏 定义啊!1000太局限了啊,还要改
#10
a8746951622014-08-12 19:35
多谢小学徒指点,i确实没用到   这只是个练习程序,没必要用宏定义。
1