/**
* 完数(5分)
* 题目内容:
* 一个正整数的因子是所有可以整除它的正整数。
* 而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。
* 例如6=1+2+3(6的因子是1,2,3)。
* 现在,你要写一个程序,读入两个正整数n和m(1<=n<m<1000),输出[n,m]范围内所有的完数。
* 提示:可以写一个函数来判断某个数是否是完数。
* 输入格式: 两个正整数,以空格分隔。
* 输出格式:其间所有的完数,以空格分隔,最后一个数字后面没有空格。如果没有,则输出一个空行。
* 输入样例:1 10
* 输出样例:6
*/
import java.util.Scanner;
public class Homerwork2 {
public static void perfectNum(int n,int m)
{
int i,j;//为循环做准备
int sum=1;//定义累加值
int cnt=0;//计数器,1000以内的完数只有三个
boolean perNumEx=false;//判断完数是否存在
for(i=n;i<=m;i++)//题目要求完数输入 1<=i<=1000
{
sum=1;//如果不重置为1,会出一堆假完数,或者干脆没有
for(j=2;j<=i/2;j++)//尽量缩小循环次数,j一定在 1~2/i 之间
{
if(i%j==0)//整除才能累加
{
sum=j+sum;
if(!(sum==i&&j==i/2))
{
continue;//这里是为了节省时间,可以直接写下面的代码
}
//完数的特征,最大的因子一定是他的1/2 24=1+2+3+4+6+8没有加到12就满了
if(sum==i&&j==i/2)
{//算了好多遍,因为有个24所以不得不加一个条件
if((cnt++)<2)//题目要求:最后一个数字后面没有空格
{
System.out.print(i+" ");
}
else
{
System.out.print(i);
}
perNumEx=true;//计算之后会直接输出完数
}
}
}
}
if(perNumEx==false)//这里不能用(!perNumEx)判断,因为不知道是true还是false
{
System.out.print('\n');//题目要求,输出空行
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
if((n>0&&n<1001)&&(m>0&&m<1001)&&(n<m)) //题目要求,一定要加
{
perfectNum(n, m);
}
in.close();
}
}
本代码已经测试完毕,数据正确。如果你有更好的方法减少循环的次数,减少内存占用,请提出方法,谢谢。