水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)
水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数,下面列举各位数的自幂数的名字:
位数 | 名称 | 例子 |
---|---|---|
一位数自幂数 | 独身数 | 0,1,2,3,4,5,6,7,8,9 |
二位数自幂数 | 没有 | |
三位数自幂数 | 水仙花数 | 153,370,371,407 |
四位数自幂数 | 四叶玫瑰数 | 1634, 8208, 9474 |
五位数自幂数 | 五角星数 | 54748, 92727, 93084 |
六位数自幂数 | 六合数 | 548834 |
七位数自幂数 | 北斗七星数 | 1741725, 4210818, 9800817, 9926315 |
八位数自幂数 | 八仙数 | 24678050, 24678051, 88593477 |
久位数自幂数 | 九九重阳数 | |
十位数自幂数 | 十全十美数 |
利用Java求三位的水仙花数,有两种实现方式:
1、先将数字转为字符串,然后再转字节数字
@Test
public void test(){
for (int i=100;i<=999;i++){
String numStr = i + "";
char[] chars = numStr.toCharArray();
int length = chars.length;
int sum = 0;//和
for (int j=0;j<length;j++){
sum += Math.pow(Integer.parseInt(chars[j] + ""),length);
}
if (i == sum){
System.out.print(i + ",");
}
}
}
2、利用求商和求余的算法,得出各位数的数值,,如153的算法如下:
个位数数值:153/1 = 153 求余:153%10 = 3
十位数数值:153/10 = 15 求余:15%10 = 5
百位数数值:15/10 = 1 求余: 1%10 = 1
然后再判断3^3 + 5^3 + 1^3 的和是否等于153,如果相等则表示是自幂数。用代码实现如下:
@Test
public void test2(){
for (int i=100;i<=999;i++){
//存放i的个位数/十位数/百位数...
List<Integer> results = new LinkedList<>();
int result = -1; //商
int multiple = 1;//倍数
while (result >= 10 || result==-1){
//求商
result = i/multiple;
//用商求余,得出各位数的数值
int remainder = result%10;
results.add(remainder);
multiple *= 10;
}
int sum = 0;//和
int length = results.size();
for (int j=0;j<length;j++){
sum += Math.pow(results.get(j),length);
}
if (i== sum){
System.out.print(i + ",");
}
}
}
结果为:153,370,371,407,