L'herbe 2020-11-17 14:11 采纳率: 25%
浏览 34
已采纳

Java中打印水仙花数的问题

所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数,如:153就是一个水仙花数。

  • 写回答

1条回答 默认 最新

  • 一头小山猪 一头小山猪(个人IP)官方账号 2020-11-28 19:59
    关注

    水仙花的问题是一个经典的练习,刚接触的时候可能会让人无从下手。就像之前谈到的问题:如何运用编程思维解决问题?(https://ask.csdn.net/questions/1103090

    第一步是要让计算机理解什么是水仙花数,然后才能写出对应逻辑的代码。但是我们发现水仙花这个概念并不能直接用基本结构表达出来,那么第二步就是拆解:先能够得到这个三位数每一个位置上的数 (个位、十位、百位),然后剩下的就简单了,做立方和,再和自身比较。

    对于提取位数的问题,其实我们可以有几种办法,按照我们正常的逻辑思维,从右往左数,先确定位数,然后读出那一位的数字就行了。对于计算机来说,一种办法是把整个数字看成一个字符串,直接截取对应位置的内容,简单粗暴,但是缺点是效率低,因为在后面计算的时候还要进行类型转换。另一种办法就是通过数学计算的方式得到,来看下面一段代码:

    public static void main(String[] args) {
        int number = 153;
        int one = number % 10;
        int two = number / 10 % 10;
        int three = number / 100 % 10;
        System.out.println("个位:" + one);
        System.out.println("十位:" + two);
        System.out.println("百位:" + three);
    }

    个位数用变量one表示,十位数用变量two表示,百位数用变量three表示。 使用求余和整除运算就能够得到对应位置的数字,那么规律在哪呢?又是如何想到的?
    首先,获得一个整数的最后一位数的方法就是把前面的那些数全部扔掉,无论有多少位,可以直接对10求余搞定。
    接下来,如果想获得十位数怎么办,我们要换个思路,只要想办法让他变成最后一位数不就行了? 于是除以一个10,再取出最后一位。

    对于百位,千位,无论多少位都是一样的思路,把它变到最后一位,为什么?因为取出最后一位的方法简单且一成不变。到最后我们其实还可以总结出一个规律,取出一个整数第N位(从右向左数)的公式为:用这个数除以10的(N-1)次方,再对10求余
    OK,接下来我们可以接着教计算机什么是水仙花数了,将每一位上的数做立方,再求和,与自身比较,想求所有的水仙花数?简单,用一个循环结构就搞定了。对于求立方的部分我们可以直接用连乘,或者借助一下Math中的pow函数(第一个参数为底数,第二个参数为指数):

    public static void main(String[] args) {
        for(int i = 100;i < 1000;i++){
            int one = i % 10;
            int two = i / 10 % 10;
            int three = i / 100 % 10;
            if(Math.pow(one,3) + Math.pow(two,3) + Math.pow(three,3) == i){
                System.out.println(i);
            }
        }
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突