1. 概念阐述:
自幂数: 一个正整数N,它有X位,N的十进制表示为X110X2X3……Xx,如果有:
N = X1x + X2x + X3x + …… + Xxx
成立,则称N为X位自幂数。
2.特殊称呼
1~10位自幂数有独特的名称:
- 一位自幂数:独身数
- 两位自幂数:没有
- 三位自幂数:水仙花数
- 四位自幂数:四叶玫瑰数
- 五位自幂数:五角星数
- 六位自幂数:六合数
- 七位自幂数:北斗七星数
- 八位自幂数:八仙数
- 九位自幂数:九九重阳数
- 十位自幂数:十全十美数
3.题目要求
- java语言输出1-10位的自幂数
4.视频直观演示
1~10位自幂数的输出
程序运行总耗时5000多秒,差不多一个半小时,压缩差不多五倍呈现成上面那种。
5.程序展示
import java.util.Scanner;
public class Self{
public static void main(String[] args) {
/**
* 由题目四得到扩展:
* 水仙数其实只是"自幂数"的一种:
* 一位自幂数:独身数
* 二位自幂数:没有
* 三位自幂数:水仙花数
* 四位自幂数:四叶玫瑰数
* 五位自幂数:五角星数
* 六位自幂数:六合数
* 七位自幂数:北斗七星数
* 八位自幂数:八仙数
* 九位自幂数:九九重阳数
* 十位自幂数:十全十美数
*/
Scanner scanner = new Scanner(System.in);
//我们想来一个循环,可以反复询问想得到的自幂数
int loopInt = 0;//=0是循环的条件
int sum = 0;//各个位数的和
illegal://不合法就退出while,不循环计算浪费时间
while(loopInt == 0){
// sum = 0;//sum要归零
// System.out.print("请输入1~10中的一个数字,表明你想得到“x位自幂数” : ");
// int choice = scanner.nextInt();//输入选择多少的自幂数
for(int choice = 1; choice <=11; choice++){//输出1-10位的自幂数,注销此句,使用上面两个可以用户输入决定
// 采用switch来进行一个名称的匹配
switch(choice){
case 1 :
System.out.println("你想得到的" + choice + "位自幂数叫“独身数”");
System.out.print("它们分别是:");
break;
case 2 :
System.out.println("不存在两位的自幂数");
break;
case 3 :
System.out.println("你想得到的" + choice + "位自幂数叫“水仙花数”");
System.out.print("它们分别是:");
break;
case 4 :
System.out.println("你想得到的" + choice + "位自幂数叫“四叶玫瑰数”");
System.out.print("它们分别是:");
break;
case 5 :
System.out.println("你想得到的" + choice + "位自幂数叫“五角星数”");
System.out.print("它们分别是:");
break;
case 6 :
System.out.println("你想得到的" + choice + "位自幂数叫“六合数”");
System.out.print("它们分别是:");
break;
case 7 :
System.out.println("你想得到的" + choice + "位自幂数叫“北斗七星数”");
System.out.print("它们分别是:");
break;
case 8 :
System.out.println("你想得到的" + choice + "位自幂数叫“八仙数”");
System.out.print("它们分别是:");
break;
case 9 :
System.out.println("你想得到的" + choice + "位自幂数叫“九九重阳数”");
System.out.print("它们分别是:");
break;
case 10 :
System.out.println("你想得到的" + choice + "位自幂数叫“十全十美数”");
System.out.print("它们分别是:");
break;
default :
System.out.println("您输入的不是1~10的整数,无法判断");
break illegal;//不合法就直接退出while循环,而不是switch循环
}
//上面水仙花数,所有关于三位的判断,全部换成可根据choice改变的变量
//这次我们要循环判断一个范围,来找出这个范围内的所有自幂数
int range = (int)Math.pow(10,(choice - 1));//1=10^(1-1)
//range = 1 10 100 1000 10000 ……
// 1<=范围<10 10<=范围<100
// for(range = range; range < range * 10; range++){//这就控制了范围
/*上面一行代码,我犯了致命错误,range<range*10是一个恒成立,也就是无限循环下去*/
int rangeTail = range * 10;
for(; range < rangeTail; range++){//这才真正控制了范围
sum = 0;//每个range都要归零,而不是在while归零
// 我们应该在一个值循环使用的位置让他归零
//
for(int position = 1; position <= choice; position++){//choice就是位数
//获得各个位的数字,逻辑在上面提过
int pst = (range % (int)(Math.pow(10,position)))
/(int)(Math.pow(10,position-1));
//各个位的choice方和,注意三位水仙花数是立方和,四位就是4次方,注意改变
sum = sum + (int)Math.pow(pst,choice);
/* 应该在所有都加好之后再判断sum,此处逻辑错误
if(sum == range){
System.out.print(range + " ");//是自幂数输出就好了,控制一下间隔
}//else 不是自幂数什么都不做
*/
}
if(sum == range){
System.out.print(range + " ");//是自幂数输出就好了,控制一下间隔
}//else 不是自幂数什么都不做
}
System.out.println();//输出一个换行
// 控制是否跳出
// System.out.print("您是否有需要继续判断的数,输入0继续,输入其他退出判断");
// loopInt = scanner.nextInt();
}
}
}
}
6.细节讨论
上述展示很明显看到,十位自幂数没有输出,这是因为,最大的十位数是9999999999,但是int的范围最大值是2147483647,这就导致(2147483647,9999999999]的数字超出范围,无法判断,把int换成long就好了。