黑马程序员技术交流社区

标题: 纠结了几个小时了,这两个代码那里有不同? [打印本页]

作者: 丁强强    时间: 2013-2-3 11:08
标题: 纠结了几个小时了,这两个代码那里有不同?
本帖最后由 丁强强 于 2013-2-3 15:07 编辑
  1. //代码①引用@薛虎     
  2. class Temp
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int cup;
  7.                 for(int a=1; a<=30; a++)
  8.                 {
  9.                         for(int b=1; b<=30; b++)
  10.                         {
  11.                                 for(int c=1; c<=30; c++)
  12.                                 {
  13.                                         for(int d=1; d<=30; d++)
  14.                                         {
  15.                                                 if(a*a*a+b*b*b==c*c*c+d*d*d&&a!=b&&b!=c&&c!=d&&d!=a&&a!=c&&b!=d)
  16.                                                 {
  17.                                                         if(a<b) {cup = a; a = b; b = cup;}
  18.                                                         if(a<c) {cup = a; a = c; c = cup;}
  19.                                                         if(a<d) {cup = a; a = d; d = cup;}
  20.                                                         if(b<c) {cup = b; b = c; c = cup;}
  21.                                                         if(b<d) {cup = b; b = d; d = cup;}
  22.                                                         if(c<d) {cup = c; c = d; d = cup;}
  23.                                                         System.out.println(d+","+c+","+b+","+a);
  24.                                                 }
  25.                                         }
  26.                                 }
  27.                         }
  28.                 }
  29.         }
  30. }
  31. [code]//代码②
  32. class xiangmu
  33. {
  34.         public static void main(String[] args)
  35.         {
  36.                         chazhao q = new chazhao();
  37.                         q.chazhao();

  38.                 }
  39. }
  40. class chazhao
  41. {
  42.         public void chazhao()
  43.         {
  44.                 for (int a=1;0<a && a<=30 ;a++ )
  45.                 {
  46.                  for (int b=1;0<b && b<=30 ;b++ )
  47.                 {
  48.                  for (int c=1;0<c && c<=30 ;c++ )
  49.                 {
  50.                 for (int d=1;0<d && d<=30 ;d++ )
  51.                 {
  52.                         paixu(a,b,c,d);

  53.                 }
  54.                 }
  55.                 }
  56.                 }
  57.         }
  58.         

  59.                 public void paixu(int a, int b, int c ,int d)
  60.         
  61.                 {
  62.                   if(a*a*a+b*b*b==c*c*c+d*d*d&&a!=b&&b!=c&&c!=d&&d!=a&&a!=c&&b!=d)

  63.                         {
  64.                                 int cup;


  65.                 if(a<b) {cup = a; a = b; b = cup;}

  66.                 if(a<c) {cup = a; a = c; c = cup;}

  67.                 if(a<d) {cup = a; a = d; d = cup;}

  68.                 if(b<c) {cup = b; b = c; c = cup;}

  69.                 if(b<d) {cup = b; b = d; d = cup;}

  70.                 if(c<d) {cup = c; c = d; d = cup;}
  71.               
  72.                           System.out.println(a+","+b+","+c+","+d);
  73.                                   }
  74.         }
  75. }
复制代码
[/code]
作者: 陈丽莉    时间: 2013-2-3 13:27
本帖最后由 陈丽莉 于 2013-2-3 13:29 编辑

      执行了一下楼主的代码,代码2对同一结果输出了不止一次。呃。。我也没弄清楚是为什么。回帖以示关注好了~
      说个题外话,个人表示有点费解这种编程思想,对于没有任何传参的那么多类实在是。。。如果只是想优化代码的话,那么下面是我的想法:

class Temp
{
      public static void main(String[] args)
      {
              for(int a=1; a<=30; a++)
              {
                      for(int b=a+1; b<=30; b++)     
                      {
                              for(int c=b+1; c<=30; c++)
                              {
                                      for(int d=c+1; d<=30; d++)   
                                      //这样的四重循环,既可以保证abcd四个数互不相同,又很大程度减少了循环所需的时间,还自动给abcd按从小到大排了序

                                              if (a*a*a+c*c*c==b*b*b+d*d*d||a*a*a+d*d*d==b*b*b+c*c*c)  
                                              //可知两个较小的数的立方之和不会等于较大两数的立方之和,所以只判断这两种情况就行了

                                              {
                                                        System.out.println(d+","+c+","+b+","+a);
                                                        //若需从小到大输出,只需颠倒楼主的输出顺序:System.out.println(a+","+b+","+c+","+d);   
                                         
                                               }
                                      }
                              }
                      }
              }
      }




PS:
如果需要从大到小排序,则只要让循环从30到1递减,b从a-1开始,依次修改即可:
for(int a=30; a>0; a--)
{
    for(int b=a-1; b>0; b--)     
    {
        for(int c=b-1; c>0; c--)
        {
            for(int d=c-1; d>0; d--)  
            {     ...     }


或者将循环层顺序倒过来即可:
for(int d=1; d<=30; d++)
{
    for(int c=d+1;c<=30;c++)     
        {
            for(int b=c+1; b<=30; b++)
            {
                for(int a=b+1; a<=30; a++)   
                {   ...   }



作者: 薛虎    时间: 2013-2-3 13:56
陈丽莉 发表于 2013-2-3 13:27
执行了一下楼主的代码,代码2对同一结果输出了不止一次。呃。。我也没弄清楚是为什么。回帖以示关注 ...

if (a*a*a+c*c*c==b*b*b+d*d*d||a*a*a+d*d*d==b*b*b+c*c*c)  
这句写成
if (a*a*a+d*d*d==b*b*b+c*c*c)  
就行了
作者: 陈丽莉    时间: 2013-2-3 14:32
薛虎 发表于 2013-2-3 13:56
if (a*a*a+c*c*c==b*b*b+d*d*d||a*a*a+d*d*d==b*b*b+c*c*c)  
这句写成
if (a*a*a+d*d*d==b*b*b+c*c*c)  

这道题里是这样,不过没验证过增加数据范围还是不是,所以就都加上了
作者: 丁强强    时间: 2013-2-3 14:41
陈丽莉 发表于 2013-2-3 14:32
这道题里是这样,不过没验证过增加数据范围还是不是,所以就都加上了


谢谢关注,我已经解决了,代码1在17-22行,有可能把a,b,c,d,从新赋值了,
代码2,没有重新赋值,这个就是区别
作者: 陈丽莉    时间: 2013-2-3 15:37
丁强强 发表于 2013-2-3 14:41
谢谢关注,我已经解决了,代码1在17-22行,有可能把a,b,c,d,从新赋值了,
代码2,没有重新赋值,这个 ...

哦!  是的呢!  唉。。 脑子锈住了我  - -|||




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