黑马程序员技术交流社区

标题: 关于水仙花数的练习题 [打印本页]

作者: 郑先明    时间: 2013-6-28 15:16
标题: 关于水仙花数的练习题
本帖最后由 孙百鑫 于 2013-6-28 20:34 编辑

每天就只花了半小时多一点的时间去总结,其余除了工作就是看视频.然后我我就想,不能每天这样.于是就想着找找联系做做,就算是看着代码打出来至少也会更熟悉代码.然后今天我做到了这题,
题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
作者: 郑先明    时间: 2013-6-28 15:22
怎么就发表了!我还没写完!!继续.练习答案的代码是:
  1. public class lianxi03
  2. {
  3. public static void main(String[] args)
  4. {    
  5.         int b1, b2, b3;     
  6.         for(int m=101; m<1000; m++)
  7. {                 b3 = m / 100;     
  8.                   b2 = m % 100 / 10;     
  9.                   b1 = m %    10;             
  10.              if((b3*b3*b3 + b2*b2*b2 + b1*b1*b1) == m)
  11. {     
  12.                      System.out.println(m+"是一个水仙花数");
  13. }    
  14. }
  15. }
  16. }   
复制代码
但是我按照答案打上去后发现编译可以过,运行也可以过,但是就是什么都没输出.
然后最近我看了面向对象的视频,就想着用面向对象的方法给表示出来,我的代码:
  1. class ShuiXiam
  2. {
  3.         static int a, b, c;
  4.         public static int show()
  5.         {
  6.                 for(int m=101;m<10000;m++)
  7.                 {
  8.                         a =m%100;
  9.                         b =m&100/10;
  10.                         c =m%10;
  11.                         if ( a*100+b*10+c==m && a*a*a + b*b*b + c*c*c==m)
  12.                         {
  13.                                 System.out.println(m+"是一个水仙花数");
  14.                         }
  15.                 }       
  16.         }       
  17. }
  18. public class ShuiXianHua
  19. {
  20.         public static void main(String [] args)
  21.         {
  22.                 ShuiXian s = new ShuiXian();
  23.                 s.show();

  24.         }
  25.                
  26. }
复制代码
可是我编译时一直提示16行缺少返回语句...我就懵了...
我认真看了几遍,真找不出错误来...
作者: 郑先明    时间: 2013-6-28 15:44
人都跑那里去了!!!
作者: 王靖远    时间: 2013-6-28 15:44
郑先明 发表于 2013-6-28 15:22
怎么就发表了!我还没写完!!继续.练习答案的代码是:但是我按照答案打上去后发现编译可以过,运行也可以过,但 ...

你这个方法返回值类型是int 你没有retrun int;你可以把返回值类型改成void
作者: 神之梦    时间: 2013-6-28 15:47
直接打印的话,返回值类型用void,不要用int
作者: 郑先明    时间: 2013-6-28 15:54
王靖远 发表于 2013-6-28 15:44
你这个方法返回值类型是int 你没有retrun int;你可以把返回值类型改成void

好  我改了  可是还是什么都没有输出  这又是为什么....我按照代码的顺序走了一遍 应该是会输出的啊...
作者: 郑先明    时间: 2013-6-28 15:56
神之梦 发表于 2013-6-28 15:47
直接打印的话,返回值类型用void,不要用int

那如果不改返回值类型  要改哪里呢?
作者: 秩宇    时间: 2013-6-28 16:04
郑先明 发表于 2013-6-28 15:54
好  我改了  可是还是什么都没有输出  这又是为什么....我按照代码的顺序走了一遍 应该是会输出的啊... ...

打错字了,第一行,shuixian 打成 shuixiam
作者: 郑先明    时间: 2013-6-28 16:06
秩宇 发表于 2013-6-28 16:04
打错字了,第一行,shuixian 打成 shuixiam 了

嗯.很细心啊~不过这个刚才我改返回值类型的时候看到了,但是现在问题不在这 ,而是我把返回值类型改成void,然后编译运行还是什么都没输出,为什么呢!
作者: oxf974025918    时间: 2013-6-28 16:16
第九行符合是不是写错了。还有153%100=53,所以算法应该也是有问题的,不能进入你的if条件,再仔细想想,如果想不出再问我,我告诉你做。
作者: oxf974025918    时间: 2013-6-28 16:18
你的返回类型是int你没有返回,也是错的,如果想不返回的话,把方法名前面的int改为void即可,

作者: oxf974025918    时间: 2013-6-28 16:25
如果不改返回类型就要在方法里面写上return m;再在主函数main里面System.out.println(ShuiXiam.show());还有你的主函数里面用对象调用静态方法是不正规的,是类名调用静态方法,如果在.net里面对象是不可以调用静态方法的。
作者: 王靖远    时间: 2013-6-28 16:26
class Debug9
{
        public static void main(String[] args)
        {
                for (int x=100;x<1000 ;x++ )
                {
                        String s  = new Integer(x).toString();
                       
                        char[] chs = s.toCharArray();
                       
                        if((Math.pow(chs[0],3)+Math.pow(chs[1],3)+Math.pow(chs[2],3))==x)
                                System.out.println(x);
                }
        }
}
我写的代码也打印不出来。暂时还没想到什么原因
作者: 秩宇    时间: 2013-6-28 16:47
郑先明 发表于 2013-6-28 15:54
好  我改了  可是还是什么都没有输出  这又是为什么....我按照代码的顺序走了一遍 应该是会输出的啊... ...

写代码要细心啊,取十位的时候算法不对 b =m/10%10;
而且你这个是只求三位数的水仙花数,m的范围不应该小于10000.
作者: 神之梦    时间: 2013-6-28 16:49
郑先明 发表于 2013-6-28 15:56
那如果不改返回值类型  要改哪里呢?

楼下已经说了改哪里了,如果楼主只是想看下结果的话,那还是选择打印吧, 如果要选择返回的话,还必须用容器存起来,楼主的方法名字写错也已经知道了,至于结果,看下面代码
  1. class ShuiXian
  2. {
  3.         static int a, b, c;
  4.         public static void show()
  5.         {
  6.                 for(int m=100;m<1000;m++)
  7.                 {
  8.                         a =m/100;
  9.                         b =m%100/10;
  10.                         c =m%10;
  11.                         if (a*a*a + b*b*b + c*c*c==m)
  12.                         {
  13.                                 System.out.println(m+"是一个水仙花数");
  14.                         }
  15.                 }        
  16.         }        
  17. }
  18. public class ShuiXianHua
  19. {
  20.         public static void main(String [] args)
  21.         {
  22.                 ShuiXian s = new ShuiXian();
  23.                 s.show();

  24.         }
  25.                
  26. }
复制代码
结果:
153是一个水仙花数
370是一个水仙花数
371是一个水仙花数
407是一个水仙花数
请按任意键继续. . .

作者: 王靖远    时间: 2013-6-28 16:52
  1. class Debug9
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 for(int x=100;x<1000;x++)
  6.                 {
  7.                         String s = new Integer(x).toString();

  8.                         char[]chs = s.toCharArray();

  9.                         int a1 = new Integer(new String(chs[0]+""));
  10.                         int a2 = new Integer(new String(chs[1]+""));
  11.                         int a3 = new Integer(new String(chs[2]+""));
  12.                        
  13.                         if((a1*a1*a1+a2*a2*a2+a3*a3*a3)==x)
  14.                                 System.out.println(x);
  15.                        
  16.         }
  17.                        
  18.         }
  19. }
复制代码
可以用了 开始忘了1对应的char类型值不是1了
作者: 秩宇    时间: 2013-6-28 16:57
王靖远 发表于 2013-6-28 16:26
class Debug9
{
        public static void main(String[] args)

在字符转换成数字的时候,是按照ASCII码转换的,数字的ASCII码是从48开始的,所以在转换之后要减去48才是原来的数字值。
作者: 王靖远    时间: 2013-6-28 16:59
秩宇 发表于 2013-6-28 16:57
在字符转换成数字的时候,是按照ASCII码转换的,数字的ASCII码是从48开始的,所以在转换之后要减去48才是 ...

哦 原来这样
作者: 郑先明    时间: 2013-6-28 17:14
神之梦 发表于 2013-6-28 16:49
楼下已经说了改哪里了,如果楼主只是想看下结果的话,那还是选择打印吧, 如果要选择返回的话,还必须用 ...

如果要选择返回的话,还必须用容器存起来
这句话我没懂...具体怎么做?
作者: 郑先明    时间: 2013-6-28 17:14
王靖远 发表于 2013-6-28 16:52
可以用了 开始忘了1对应的char类型值不是1了

这代码我看不懂....
作者: 郑先明    时间: 2013-6-28 17:17
秩宇 发表于 2013-6-28 16:47
写代码要细心啊,取十位的时候算法不对 b =m/10%10;
而且你这个是只求三位数的水仙花数,m的范围不应该小 ...

好吧 脑袋不是很好使...我看1000没输出 于是就加了个0...没改回来...还有abc的算法我完全照搬答案的..所以有没错我不知道..
作者: 郑先明    时间: 2013-6-28 17:22
秩宇 发表于 2013-6-28 16:47
写代码要细心啊,取十位的时候算法不对 b =m/10%10;
而且你这个是只求三位数的水仙花数,m的范围不应该小 ...

不对啊...算法没错啊.我刚才算了下,没错...
作者: 郑先明    时间: 2013-6-28 17:28
oxf974025918 发表于 2013-6-28 16:25
如果不改返回类型就要在方法里面写上return m;再在主函数main里面System.out.println(ShuiXiam.show());还 ...

嗯对  静态函数直接用类名调用就可以了!但是按照你说的 在if语句里头加了return m;然后在主函数加输出语句,提示在18行缺少返回值,返回值类型是int
作者: 郑先明    时间: 2013-6-28 17:35
秩宇 发表于 2013-6-28 16:47
写代码要细心啊,取十位的时候算法不对 b =m/10%10;
而且你这个是只求三位数的水仙花数,m的范围不应该小 ...

取百位的算法错了  取十位的没错
作者: 秩宇    时间: 2013-6-28 19:57
郑先明 发表于 2013-6-28 17:35
取百位的算法错了  取十位的没错

哦 口误 改了应该可以了吧? 我试了可以
  1. public class Test2 {

  2.     public static void main(String [] args)
  3.     {
  4.         ShuiXian s = new ShuiXian();
  5.         s.show();

  6.     }

  7.     static class ShuiXian
  8.     {
  9.         static int a, b, c;
  10.         public static void show()
  11.         {
  12.             for(int m=101;m<1000;m++)
  13.             {
  14.                 a =m/100;
  15.                 b =m/10%10;
  16.                 c =m%10;
  17.                // System.out.println(a+" "+ b +" "+c);
  18.                 if (a*100+b*10+c==m && a*a*a + b*b*b + c*c*c==m)
  19.                 {
  20.                     System.out.println(m+"是一个水仙花数");
  21.                 }
  22.             }
  23.         }
  24.     }
  25. }
复制代码

作者: 郑先明    时间: 2013-6-28 20:32
秩宇 发表于 2013-6-28 19:57
哦 口误 改了应该可以了吧? 我试了可以

OK了!!原来练习的原答案都是错的...不过数学我真的很烂...对于数学题很无奈!




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