水仙花数(Java)
水仙花数(Narcissistic Number)是一个数学术语,是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。例如,153就是一个水仙花数,因为13+53+3^3=153。
水仙花数的计算步骤可以分为以下几步:
- 将给定的数字的每个位分离出来。
- 对每个位上的数字进行n次幂的计算,n为数字的位数。
- 将每个位上的数字的n次幂相加。
- 将相加的值与输入的数进行比较,如果相等,则说明数字是一个水仙花数。
//这是一段最简单的求三位数的水仙花数代码,其中没有用到什么方法
public class Demo_01_水仙花数 {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
System.out.println("三位数的水仙花数:");
for(int i=100;i<1000;i++) {
int bai = i/100;
int shi = i%100/10;
int ge = i%10;
if(i==(bai*bai*bai+shi*shi*shi+ge*ge*ge)) {
System.out.println(i+"是水仙花数。");
}
}
}
}
打印输出的结果是:
三位数的水仙花数:
153是水仙花数。
370是水仙花数。
371是水仙花数。
407是水仙花数。
以下是输入一个数,打印一百到该数之间所有的水仙花数:
(代码运行流程及思路写在了代码中方便阅读理解)
/**
* 水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。
* 例如,153是一个三位数的水仙花数,因为1³ + 5³ + 3³ = 153。
*/
public class NarcissisticNumbers {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数:");
int number = input.nextInt();
System.out.println("100到" + number + "之间的水仙花数有:");
//利用for循环,迭代检查当前数字是否是水仙花数,传入i,返回sum
for (int i = 100; i <= number; i++) {
if (isNarcissisticNumber(i)) {
//判断是水仙花数之后打印输出
System.out.println(i);
}
}
//用于关闭Scanner对象所代表的输入流,这样可以确保在使用完输入流后释放资源,把你面内存泄漏问题
input.close();
}
// 判断一个数是否为水仙花数
public static boolean isNarcissisticNumber(int num) {
//用于接受整数参数num。
int originalNum = num;
//初始化sum变量,用于计算数字的各位数字的n次幂之和。
int sum = 0;
//返回以10为底数的对数,得到数字的位数,并将n次幂加到sum中
int digits = (int) Math.log10(num) + 1;
//使用while循环,将每个位上的数字提取出来,并将其n次幂加到sum中
//当数字为0,退出循环
while (num > 0) {
int digit = num % 10;
sum += Math.pow(digit, digits);
num /= 10;
}
//判断sum是否等于原始值,如果相等则返回(boolean)true,表示该数是水仙花数
return sum == originalNum;
}
}
打印输出的结果:
请输入一个数:
23453
100到23453之间的水仙花数有:
153
370
371
407
1634
8208
9474
其实除了计算之外,水仙花数也有很多有趣的特点和历史背景:
水仙花数的概念源于古希腊神话中的纳西索斯(Narcissus),他因为自恋而被神惩罚,最终爱上了自己的倒影。这个故事被莎士比亚等作家运用,成为了文学上的经典题材。而数学家们则从中得到了灵感,创造了水仙花数这个概念。
水仙花数在数学、计算机科学、密码学等领域都有应用。例如,在密码学中,水仙花数可以用来生成密码和密钥,因为它们的位数大、容易记忆、难以被破解等特点。
总之,水仙花数是一个有趣而富有传奇色彩的数学概念,虽然在实际应用中并不常见,但它仍然是一个被广泛研究的话题,具有理论意义和实际应用价值。