水仙花数的定义是:一个三位数,它的每个位上的数字的立方和等于它本身。
例如:
- 153 = 1^3 + 5^3 + 3^3
- 370 = 3^3 + 7^3 + 0^3
- 371 = 3^3 + 7^3 + 1^3
public class NarcissisticNumber {
public static void main(String[] args) {
// 输出 100 到 999 之间的所有水仙花数
printNarcissisticNumbers(100, 999);
}
/**
* 打印指定范围内的所有水仙花数
* @param start 搜索范围的下限
* @param end 搜索范围的上限
*/
public static void printNarcissisticNumbers(int start, int end) {
// 遍历从 start 到 end 的所有数字
for (int i = start; i <= end; i++) {
// 如果 i 是水仙花数,则打印它
if (isNarcissisticNumber(i)) {
System.out.println(i + " is a narcissistic number.");
}
}
}
/**
* 判断一个数字是否为水仙花数
* @param num 待判断的数字
* @return 如果 num 是水仙花数,返回 true;否则返回 false
*/
private static boolean isNarcissisticNumber(int num) {
// 获取 num 的位数
int numDigits = getNumberOfDigits(num);
// 初始化变量 sum 用于保存每个位上的数字的 numDigits 次幂之和
int sum = 0;
// 暂存 num,以免在计算过程中被修改
int originalNum = num;
// 遍历 num 的每个位上的数字,并将它们的 numDigits 次幂累加到 sum 中
while (num > 0) {
int digit = num % 10;
sum += Math.pow(digit, numDigits);
num /= 10;
}
// 如果 sum 等于原始的 num,则 num 是水仙花数
return sum == originalNum;
}
/**
* 获取一个数字的位数
* @param num 待计算位数的数字
* @return 数字的位数
*/
private static int getNumberOfDigits(int num) {
// 如果 num 为 0,返回 1,否则返回 num 的位数
return num == 0 ? 1 : (int) Math.log10(num) + 1;
}
}
这个算法的实现步骤如下:
- 在 printNarcissisticNumbers 方法中,遍历从 start 到 end 的所有数字。
- 对于每个数字 i,调用 isNarcissisticNumber 方法,判断它是否为水仙花数。
- 如果 i 是水仙花数,则打印它。
isNarcissisticNumber 方法的实现步骤如下:
- 调用 getNumberOfDigits 方法,获取输入数字 num 的位数。
- 初始化一个变量 sum 来保存每个位上的数字的 numDigits 次幂之和。
- 暂存 num,以免在计算过程中被修改。
- 遍历 num 的每个位上的数字,并将它们的 numDigits 次幂累加到 sum 中。
- 如果 sum 等于原始的 num,则 num 是水仙花数,返回 true。
- 否则,返回 false。
getNumberOfDigits 方法的实现步骤如下:
- 如果输入数字 num 为 0,返回 1。
- 否则,返回 num 的位数,通过取 log10(num) 的整数部分加 1 来计算。
通过这个算法,我们可以找到 100 到 999 之间的所有水仙花数。