目录
1.什么是水仙花数
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(
例如:1^3 + 5^3+ 3^3 = 153)。
2.低端程序员普通写法(开玩笑的)
循环依次求出:个,十,百位上的数 ,当各位数的立方和等于该数,打印出来
下意识的解法,看似没有问题,但是有很大缺陷:
优化方向:
1.无法自由规定是几位数内的
2.无法超出当前位数
3.计算立方和的时候及其繁琐
4.不便于代码的修改
public static void main22(String[] args) {
//水仙花数 0--999
for (int num = 0;num<=999;num++) {
int ge = num%10;
int shi = num/10%10;
int bai = num/100%10;
int res = ge*ge*ge+shi*shi*shi+bai*bai*bai;
if(num==res){
System.out.println(num);
}
}
3.稍微动了点脑的程序员之更上一层楼
以下是改进的优化版本,详情注释已解释
通过Scanner可以输入需要几位数以内的水仙花数
第一个while循环用来进行位数的运算,求出位数
第二个while循环用来计算出各个位上的数,和位数一起,求出立方和
当立方和等于该数时,打印出来,随后进入下一个循环
public static void main(String[] args) {
//水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i <= n; i++) { //从0开始依次递增(包含各位数,最小的百位数是153从百位数开始,i=100即可)
int temp = i; //用temp存储i,计算位数用temp,避免i改变
int count = 0; //count计数
while (temp != 0) { //当temp,也就是i不等于0时,对temp除10
temp /= 10; //依次去掉一个位数
count++; //计算这个数的位数
}
int sum = 0; //求和
temp = i; //temp 值已经改变,将i赋过去
while (temp != 0) {
sum += Math.pow(temp % 10, count); //%10算出当前位置上的数字,与次数算出立方,在依次相加
temp /= 10; //依次去掉一个位数
}
if(sum==i){ //当sum,也就是各位的立方和等于i时,打印i
System.out.println(i);
}
}
}