水仙花数(超完全数字不变数):是指一个n位数(n>=3),它的每个位上的数字的n次幂之和等于它本身。

                举例:153=1*1*1+5*5*5+3*3*3。

求100-1000以内的水仙花数:

    处理逻辑:循环,循环内按位取数存入临时值中,求和,最后和当前数值作比较相等就输出当前值。

    程序:

int a = 0,b=0,c=0,sum=0;
for(int i = 100; i <1000;i++){
	a=i/100;
	b=i%100/10;
	c=i-a*100-b*10;
	sum = a*a*a+b*b*b+c*c*c;
	if(sum==i){
	System.out.println("1000以内的水仙花数有:"+i);
	}
}

需要注意的点是:取每个位上的数字时,要注意选择正确求余(%)或者求商(/)

 

完数:如果一个数字等于他的真因数(除了它本身的因数)之和,那么这个数即被称为完数。

           举例:6=1+2+3 。

求1000以内的完数。

    处理逻辑:(穷举法)嵌套循环,两次循环:外层循环用来选择要进行完数判断的值,内层循环用来判断当前值是否是外层值的因数,如果是,就将当前值求和存于临时值中(每次临时值需要在外层循环中更新),内层循环中的循环条件只要小于外层值的0.5就可以,算法优化。最后在外层中进行判断临时值和外层值是否相等,就可以得到完数。

程序:

for(int i = 1 ; i<1000 ; i++){
	int num = 0 ;       //更新临时值
	for(int j = 1 ; j <= i/2 ; j++){
	        if(i%j==0){  //判断内层值是否是外层值的因数。
		    num = num+j;
	        }				
	}
	if(num == i){
	        System.out.print(i+"  ");
	}
}

质数:一个数的因数只有1和其本身,这样的数称为质数。

           举例:2=1*2

求2-200中的质数。

程序:

for(int i = 2 ; i < 200 ; i++){
			boolean temp = false ;  //每次更新临时值用来决定当前外层循环值是否是质数。
			if(i==2||i==3){
				temp = true;
			}
//需要单独输出2,3 原因:这里的math.sqrt是求一个数字的平方根。2和3的平方根都小于2所以不会进入循环。
//这里为什么要开平方的原因是:如果一个数是合数,他的因数必定存在一个大于或等于它的平方根,一个小于或等于它的平方根。并且成对出现
			for ( int j = 2 ; j < Math.sqrt(i); j+=2 ){ //这里为什么从2开始,因为是1开始是没必要的,1是任何数的因数,每次加2的原因刨除除了2之外所有的偶数。
				if(i%j==0){
					temp = false ; 
					break;
				}else{
					temp = true;
				}
			}
			
			if(temp){
				System.out.println("2-200中为质数是:"+i);
			}
		}

这里研究的关键是:用来一个boolean值来作为判断是否是质数的标准,boolean值的运用在一些程序中有妙用。适用于两种情况是或者非。