Java学习笔记

水仙花数的定义

在数论中,水仙花数(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);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值