超简单地输出所有水仙花数(Java实现)

今天打算将以前简单又基础的练习题拿出来分享以下,虽然很简单,但也很适合刚入门的小白练练手,熟悉熟悉以下。

 🐱‍🏍开场还是得简单以下水仙花数是一种什么样的数。


 ❀水仙花数:        

        水仙花数只是自幂数的一种,也被称为(超完全数字不变数)水仙花数是指一个 3 位数,它的每个位上的数字的3次幂之和等于它本身,例如:1^3 + 5^3+ 3^3 = 153。严格来说3位数的3次幂数才称为水仙花数。可还存在着其它位数所对应的水仙花数。

例如:

三位自幂数:水仙花数;三位的水仙花数共有4个:153,370,371,407;

四位自幂数:四叶玫瑰数;四位的四叶玫瑰数共有3个:1634,8208,9474;

五位自幂数:五角星数;五位的五角星数共有3个:54748,92727,93084;

六位自幂数:六合数;六位的六合数只有1个:548834;

=====================================================================

等等,对于这些水仙花数的名称我们无需了解,只要知道是什么原理就可以,无非就是对于几位数的每一位上的自身几次幂之和等于本身(例如五位数,每一位进行五次幂之后再相加得出的结果会等于这个五位数,就符合条件),就属于水仙花数。

废话不多说,接下来分析如何通过代码如何实现输出水仙花数。

如果单单打印所有的3位水仙花数,下面这个代码应该是最无脑的。

对于打印3位的水仙花数,我们可以稍微分析一下,

水仙花数对应的是每一位数自身位数的幂相加等于自身,那么如果要实现这个代码,可以把从100到999的每一数字的个十百位提取出来,然后加以比较,看看是否符合条件,如果符合条件则打印,否则则继续循环,直到将100到999的每个数判断完为止。

代码示例:

public class TestDemo1 {
        public static void Prints(){
            for (int i = 100; i < 1000; i++) {
                    int j = i % 10;         //个位
                    int k = i / 10 % 10;    //十位
                    int l = i / 100;        //百位
                    if (i==(j*j*j)+(k*k*k)+(l*l*l)) {
                        System.out.print(i + " ");
                    }
            }
    }
    public static void main(String[] args) {
        System.out.println("打印1到1000内的符合水仙花的数");
        Prints();
    }
}

//运行结果:
//打印1到1000内的符合水仙花的数
//153 370 371 407 

其中判断条件可以利用Java内的Math类进行以某一位数为底数,以一共几位数为指数的幂值,例如163-------Math.pow(1,3)+Math.pow(6,3)+Math(3,3);

=====================================================================

Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。

 

public class TestDemo1 {
        public static void Prints(){
            for (int i = 100; i < 1000; i++) {
                    int j = i % 10;         //个位
                    int k = i / 10 % 10;    //十位
                    int l = i / 100;        //百位
                    if (i==Math.pow(j,3)+Math.pow(k,3)+Math.pow(l,3)) {
                        System.out.print(i + " ");
                    }
            }
    }
    public static void main(String[] args) {
        System.out.println("打印1到1000内的符合水仙花的数");
        Prints();
    }
}

但如果我们不止想打印三位数的水仙花数,还想打印四位的,五位的,甚至是六位的,用上面这种方法太局限了,是无法实现 。要想实现打印跟高位数的水仙花数,得多增添一步,判断当前数的位数是多少,再根据位数进行对应幂数的相加。

(1)首先我们以打印从1到999999为例的水仙花数(0不为水仙花数),先在循环内写一个判断位数的代码。

 while(j!=0){
//判断当前数是几位数(j是1到999999某一个数,通过for循环内的i来赋给j,在每一次循环中进行一次赋值)
    ret++;    //位数值
    j/=10;    //通过每一次除10来使当前值进行循环判断
}

(2)之后就可以求每一位数的幂和,将i赋给一个新的整型n,通过n取余来提取个位数后,再通过除10来对n进行更新,以sum来计算幂的和,当n除到等于0时,便结束提取的过程。

while(n!=0){
//计算每一位数幂的和
    sum+=Math.pow(n%10,ret);
    n/=10;
}

(3)最后判断是否满足每一位数的幂和,是否等于自身,满足条件输出,不满足则跳过,继续循环判断。

if(sum==i){
    System.out.println(i);
}

=====================================================================

完整代码:

public class TestDemo2 {
    public static void Print() {
        for (int i = 1; i < 999_999; i++) {
            int j=i,ret=0,n=i,sum=0;
            while(j!=0){
                //判断当前数是几位数
                ret++;
                j/=10;
            }
            while(n!=0){
                //计算每一位数幂的和
                sum+=Math.pow(n%10,ret);
                n/=10;
            }
            if(sum==i){
                System.out.print(i+" ");
            }
        }
    }
    public static void main(String[] args) {
        Print();
    }
}

//运行结果:
//1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084 548834 

  • 42
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星河栀染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值