水仙花数
水仙花数
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次
幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)
-
个人实现方式
public class NarcissisticNumber {
public static void main(String[] args) {
/**
* 输出所有的水仙花数
* 以下代码为个人编写,略微冗余
*/
// 用于定义循环的数值,单独定义是为了不让代码中出现魔法值(及未经定义的常量)
int ciculation = 999;
// 初始化个位的值
int one = 0;
// 初始化十位的值
int ten = 0;
// 初始化百位的值
int hundred = 0;
// 循环执行100-999之间的所有三位数
for (int i = 100; i <= ciculation; i++) {
// 整数通过除法运算结果产生小数后,会自动舍弃小数、保留整数部分(不会使用“四舍五入”精确度的计数保留法)
hundred = i / 100;
// 根据上面同样的方式计算出十位的数字
ten = (i - hundred * 100) / 10;
// 通过减去百位与十位相加的结果得到个位的数字
one = i - (hundred * 100 + ten * 10);
// 计算出百位数字的立方结果并赋值
int hundredCubic = (int)Math.pow(hundred,3);
// 计算出十位数字的立方结果并赋值
int tenCubic = (int)Math.pow(ten,3);
// 计算出个位数字的立方结果并赋值
int oneCubic = (int)Math.pow(one,3);
// 将各个位置的数字相加后给结果赋值
int result = hundredCubic + tenCubic + oneCubic;
// 如果三位立方相加总和等于其本身,则打印输出该数值
if (result == i){
System.out.println(i);
}
/* // 各个位数直接相乘三次得到立方值后再相加也可以
int outcome = hundred * hundred * hundred + ten * ten * ten + one * one * one;
if (outcome == i) {
System.out.println(i);
}*/
}
}
}
-
精简实现方式
public class NarcissisticNumber {
public static void main(String[] args) {
// 初始化开始循环的变量值为100
int num = 100;
// 定义各位上存放拆解后数值的数组
int arr[] = new int[3];
System.out.print("3位的水仙花数有:\t");
while (num <= 999) {
// 定义各位上立方数相加总和变量
int sum = 0;
// 计算拆解后各位置上相应的数值,并存入数组
arr[0] = num / 100 % 10;
arr[1] = num / 10 % 10;
arr[2] = num % 10;
// 通过循环及Math.pow()函数得到各数组位置的立方值并相加
for (int i = 0; i < 3; i++) {
sum = sum + (int) Math.pow(arr[i], 3);
}
// 判断如果立方数总和等于当前数值,则进行打印输入
if (num == sum) {
System.out.print(num + "\t");
}
num++;
}
}
}
控制台输出:
本文来自博客园,作者:Schieber,转载请注明原文链接:https://www.cnblogs.com/xiqingbo/p/java-05.html