水仙花数(超完全数字不变数):是指一个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值的运用在一些程序中有妙用。适用于两种情况是或者非。