上机内容:编程找出1000以内的所有完数。编程找出1000以内的所有完数。一个数如果恰好等于它的因子(除它本身之外)之和,这个数就称为“完数”。
例如6=1+2+3,再如8的因子和是7(即1+2+4),8不是完数。
上机目的:循环结构编程
我的程序:
运行结果:
例如6=1+2+3,再如8的因子和是7(即1+2+4),8不是完数。
上机目的:循环结构编程
我的程序:
/*
* 程序的版权和版本声明部分:
* Copyright (c) 2013, 青岛农业大学理信学院
* All rights reserved.
* 文件名称:输出完数.cpp
* 作 者:幻影行者
* 完成日期:2013 年 7 月 25 日
* 版 本 号:v1.0
* 对任务及求解方法的描述部分:
* 输入描述:无
* 问题描述:编程找出1000以内的所有完数。一个数如果恰好等于它的因子(除它本身之外)之和,这个数就称为“完数”。
* 例如6=1+2+3,再如8的因子和是7(即1+2+4),8不是完数。
* 程序输出:略
* 问题分析:略
* 算法设计:略
*/
//解法一:
#include <iostream>
using namespace std;
int main( )
{
int i,j,sum;
cout<<"1000以内的完数有:";
for(i=2;i<=1000;i++) //直接从2开始,因为1肯定不是完数
{
sum=1; //sum初值为1,因为1是1000以内所有数的因子,也是下面的j从2开始的原因
for(j=2;j<=i/2;j++) //这里j最大只能为i的一半,即所除的因子最大只能是这个数的一半,这就排除的因子是它本身的情况
{
if(i%j==0) //能被i整除即是i的因子,要累加到sum中
sum+=j;
}
if(i==sum) //因子之和等于这个数,则该数为完数,输出
cout<<i<<"\t";
}
cout<<endl;
return 0;
}
//解法二:
/*
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,m,sum;
cout<<"1000以内的所有完数如下:"<<endl;
for(i=2;i<=1000;++i) //直接从2开始,因为1肯定不是完数
{
sum=1; //sum初值为1,因为1是1000以内所有数的因子
for(m=2;m<sqrt(i);++m) //m从2开始,只要能被i整除即累加到sum中,m<sqrt(i)
{
if(i%m==0)
sum+=(m+i/m); //m能被i整除即累加到sum中,同时与m“相对”(如2能被6整除,3则是与2相对的因子)的那个因子也加到sum中
}
if(i==sum) //因子之和等于这个数,则该数为完数,输出
cout<<i<<'\t';
}
cout<<endl;
return 0;
}*/
运行结果: