黑马程序员技术交流社区

标题: 练习三:水仙花数 [打印本页]

作者: maxwell247    时间: 2015-9-21 16:38
标题: 练习三:水仙花数
从网上找到一份编程练习题,我决定将里面的题目全都做一遍。

/**
        题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
        例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
*/

/*
        分析:三位整数分解
        思路一:从100循环到999,将数分解为 个位、十位、百位。
        思路二:个位、十位、百位分别从0到9三重循环组合成整数
*/
class  ShuixianhuaDemo{

        public static void main(String[] args) {
                System.out.println("打印水仙花数:");
                shuixianhua_1();
                System.out.println("\n----------------");
                shuixianhua_2();
        }

        //思路一的实现
        public static void shuixianhua_1(){
                for (int i=100;i<1000;i++){
                        int g=i%10; //个位
                        int s=(i/10)%10; //十位
                        int b=i/100; //百位
                        if (i==g*g*g+s*s*s+b*b*b){
                                System.out.print(i+" ");
                        }
                }
        }

        //思路二的实现
        public static void shuixianhua_2(){
                for (int i=1;i<=9 ;i++ ){ //百位
                        for (int j=0;j<=9 ;j++ ){ //十位
                                for (int k=0; k<=9;k++ ){ //个位
                                        int tmp1=100*i+10*j+k;
                                        int tmp2=i*i*i+j*j*j+k*k*k;
                                        if (tmp1 == tmp2){
                                                System.out.print(tmp1+" ");
                                        }
                                }
                        }
                }
        }
}


作者: becky_ny    时间: 2015-9-21 16:44
太牛了
作者: 枕草虫    时间: 2015-9-21 16:48
思路二学习了
作者: 佳期或可梦    时间: 2015-9-21 18:29
学习,以前看到过这个题目,没有深究
作者: beyond1337    时间: 2015-9-21 18:40
更建议哪个思路?
作者: 哈哈我赢了    时间: 2015-9-21 22:50
顶一下。。。。。
作者: hei军    时间: 2015-9-23 10:43
第二个思路更容易理解   谢了
作者: 丶摇滚少年    时间: 2015-9-25 21:23
楼主第二思路,的确让人耳目一新。
我今天也写了个水仙花,编译没问题,运行,死循环,不断打出1111...
代码如下:
/* 需求:在控制台输出所有的”水仙花数”
         所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。*/
class Homework_1 {
        public static void main(String[] args) {
       
        for (int i = 100; i < 1000;i++ ) {
                int temp = i;
                int ge,shi,bai;
                ge = i % 10;//取出个位,假设i取到123  ge=123%10=3
                i = i / 10;//截掉最低位 i=12
                shi = i % 10;// shi = 2
                bai = i / 10;// bai =1
                int a = ge * ge * ge + shi * shi * shi + bai * bai * bai;
                if (temp==a) {
                        System.out.print(temp);
                }
               
        }
        }
}

作者: 纳木错的程序猿    时间: 2015-9-25 22:32
楼主第二种思路还真第一次见,学习了。请问下是如何想到的呢
作者: qiaozengji668    时间: 2015-9-25 22:43
顶一下!!!
作者: 纳木错的程序猿    时间: 2015-9-25 23:24
丶摇滚少年 发表于 2015-9-25 21:23
楼主第二思路,的确让人耳目一新。
我今天也写了个水仙花,编译没问题,运行,死循环,不断打出1111...
代 ...

你这个进入死循环了。
第一次循环:i=100,temp=100(temp=i)  ge=0(100%10),i = 10(100/10),shi = 0(10%10) ,bai = 1(10/10)  a = 0*0*0 + 0*0*0 + 1*1*1 = 1  temp(100)是不等于a的,所以不打印temp,然后i自加1进入第二次循环。
第二次循环:i = 11 ,temp=11(temp=i),ge=1,i = 1,shi=1,bai=0
a = 1*1*1 + 1*1*1 + 0*0*0 = 2 还是不等于temp,然后i自加1进入第三次循环
第三次循环 : i = 2,temp = 2,ge = 2,i = 0,shi = 0 bai=0
a = 2*2*2  + 0*0*0 + 0*0*0 = 8 ,i=0自增1后,进入第四次循环  
第四次循环:i = 1,temp =1,ge = 1,i = 0,shi = 0,bai = 0
a = 1*1*1 + 0*0*0 + 0*0*0 =1 ,此时  a和temp就相等了,才第一次打印temp  为1
从第五次循环后,就进入死循环了。所有你看到的是打印11111。。。。
作者: 阿秋    时间: 2015-9-27 11:20
思路二牛!
作者: 插兜    时间: 2015-9-27 11:41
楼主威武霸气




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2