水仙花数的定义
在数论中,水仙花数(Narcissistic number),也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number) ,用来描述一个N位非负整数,其各位数字的N次方和等于该数本身
设有自然数n,d为该自然数各位数字,即 n = dkdk-1…d1 ,则有:
n = dk·10k-1 + dk-1·10k-2 + … + d2·10 + d1,
如果该自然数n满足条件:
n = dkk + dk-1k + … + d2k + d1k.
则这个自然数就被称为超完全数字不变数。 例如153、370、371及407就是三位超完全数字不变数,其各个数之立方和等于该数
本次只拿1~6位自幂数的范围来讲解
实现水仙花数的前提
1:需要用方法来实现
2:返回值是void,因为数据太大
public static void water_Flower(int n){
for (int i = 1; i <= n ; i++) { // i是需要求的数
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
water_Flower(n);
}
3:需要知道一个多位数的位数
比如-------------1是一位数-------------12是两位数-------------123是三位数-------------1234是四位数……
十进制的数只需要除10即可
例如:
第一次:123/10=12
第二次:12/10=1
第三次:1/10=0
除了n次,这个多位数的个数就是n
int count = 0;//数字的位数
while( i != 0){
count++;
i /=10;
}
这个代码的作用是求数字的位数,而i是需要求水仙花数的值,但是到了最后i == 0,这个结果并不是我们想要的
所以再把i赋值给另一个数即可
int tmp = i;
int count = 0;//数字的位数
while( tmp != 0){
count++;
tmp /= 10;
}
这个代码走完,tmp的作用相当于i,而count已近求得了这个数是几位数
4:需要把一个多位数拆分成单独的数字
12拆分成“1”和“2”-------------123拆分成“1”和“2”和“3”-------------1234拆分成“1”和“2”和“3”和“4”……
具体实现可分为
第一步:123 % 10 = 3
第二步:123 / 10 = 12
第三步:12 % 10 = 2
第四步:12 / 10 = 1
第五步:1 % 10 = 1
第六步:1 / 10 = 0
奇数步求的值为多位数拆分后的数,偶数步是求拆分后的数的必要步骤
// 重新把i赋值给tmp
tmp = i;
while(tmp != 0){
Math.pow(tmp%10,count);//tmp^3
tmp /= 10;
}
注意:之前tmp为0,所以要重新赋值,count已近知道了是几位数,所以直接作为即可tmp的次方即可
再求和即可
int num = 0;
tmp = i;
while(tmp != 0){
num += Math.pow(tmp%10,count);
tmp /= 10;
}
最后判断num是不是等于i,附上全代码
public static void water_Flower(int n){
// 1~999999之间的数
for (int i = 1; i <= n ; i++) {
int tmp = i;
int count = 0;//数字的位数
while( tmp != 0){
count++;
tmp /= 10;
}
// 以上代码走完 tmp == 0
// 重新把i赋值给tmp
tmp = i;
int sum = 0;// 求和
while(tmp != 0){
sum += Math.pow(tmp%10,count);
tmp /= 10;
}
if(sum == i){
System.out.println(i);
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
water_Flower(n);
}
}