翁恺老师java作业,第七周2

/**
 * 完数(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();
	}
}

本代码已经测试完毕,数据正确。如果你有更好的方法减少循环的次数,减少内存占用,请提出方法,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值