A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© maxwell247 中级黑马   /  2015-9-21 16:38  /  1112 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

从网上找到一份编程练习题,我决定将里面的题目全都做一遍。

/**
        题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
        例如: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+" ");
                                        }
                                }
                        }
                }
        }
}

12 个回复

倒序浏览
becky_ny 来自手机 中级黑马 2015-9-21 16:44:44
沙发
太牛了
回复 使用道具 举报
思路二学习了
回复 使用道具 举报
学习,以前看到过这个题目,没有深究
回复 使用道具 举报
更建议哪个思路?
回复 使用道具 举报
顶一下。。。。。
回复 使用道具 举报
hei军 中级黑马 2015-9-23 10:43:36
7#
第二个思路更容易理解   谢了
回复 使用道具 举报
楼主第二思路,的确让人耳目一新。
我今天也写了个水仙花,编译没问题,运行,死循环,不断打出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 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。。。。
回复 使用道具 举报
思路二牛!
回复 使用道具 举报
楼主威武霸气
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马