水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
定义:水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
题目描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。 现在要求输出所有在m和n范围内的水仙花数。
输入描述:
输入数据有多组,每组占一行,包括两个整数m和n(100 ≤ m ≤ n ≤ 999)。
输出描述:
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int start = input.nextInt();
int end = input.nextInt();// 系统输入两个整数
ArrayList out = flower(start, end);// 调用方法
if (out.isEmpty()) {// 判断是否为空,按格式输出no。
System.out.println("no");
} else {
for (int i = 0; i < out.size(); i++) {// 按格式输出
if (i != out.size() - 1) {// 最后一个不需要输出空格
System.out.print(out.get(i) + " ");
} else {
System.out.print(out.get(i));
}
}
}
}
public static ArrayList flower(int startNumber, int endNumebr) {
ArrayList flowerNumber = new ArrayList();
int j = 0;
for (int i = startNumber; i < endNumebr; i++) {
/*
* 若满足条件放入数组 条件是分别取出3个位的数的3次方相加==原数
*/
if ((i == Math.pow(Math.floor(i / 100), 3) + Math.pow(Math.floor(i % 100 / 10), 3)
+ Math.pow(i % 100 % 10, 3)) && i >= startNumber && i <= endNumebr) {
flowerNumber.add(i);
}
}
return flowerNumber;// 返回数组
}
}
Java三种求水仙花数的方法
注意:要判断一个三位数是不是水仙花数,得先取得这个三位数的的个位,十位和百位
普通for循环:
import java.util.Scanner;
public class TestNarcissus {
/*
* public static void main(String[] args) {
* int num = 100; int a[] = new int[3];
* System.out.print("3位的水仙花数有:\t");
* while (num <= 999) {
* int sum =0;
* a[0] = num / 100 % 10;
* a[1] = num / 10 % 10;
* a[2] = num % 10;
* for (int i = 0; i < 3; i++) {
* sum = sum + (int) Math.pow(a[i], 3);
* }
* if (num ==sum) {
* System.out.print(num + "\t"); } num++;
* }
* }
*/
public static void main(String[] agrs) {
System.out.print("指定最大位数N:");
Scanner input = new Scanner(System.in);
int N = input.nextInt();
input.close();
for (int i = 3; i <= N; i++) {
int a[] = new int[i];
int num = (int) Math.pow(10, i - 1) + 1;
System.out.print(i + "位的水仙花数有:\t");
while (num <= Math.pow(10, i)) {
int sum = 0;
for (int j = 0; j < i; j++)
a[j] = (int) (num / Math.pow(10, j) % 10);
for (int j = 0; j < i; j++)
sum = sum + (int) Math.pow(a[j], i);
if (num == sum)
System.out.print(num + "\t");
num++;
}
System.out.print("\n");
}
}
}
while循环:
public class Daffodil {
public static void main(String args[]){
int i=100;
int count=0; //定义水仙花数的个数
while(i<10000){
int b = i/100; //取得百位数
int s = (i-100*b)/10; //取得十位数
int g = (i-s*10-b*100); //取得个位数
if(i==g*g*g+s*s*s+b*b*b){ //水仙花数判定
System.out.print(i+" "); //输出符合条件的数
count++;
}
i+=1;
}
System.out.println();
System.out.println("水仙花数总共有"+count+"个"); //输出水仙花数的总数
}
}
do-while循环:
public class Daffodil {
public static void main(String args[]){
int i=100;
int count=0; //定义水仙花数的个数
do{
i+=1;
int b = i/100; //取得百位数
int s = (i-100*b)/10; //取得十位数
int g = (i-s*10-b*100); //取得个位数
if(i==g*g*g+s*s*s+b*b*b){ //水仙花数判定
System.out.print(i+" "); //输出符合条件的数
count++;
}
}while(i<10000);
System.out.println();
System.out.println("水仙花数总共有"+count+"个"); //输出水仙花数的总数
}
}