黑马程序员技术交流社区

标题: 谁能帮我看看这个代码的问题(已解决) [打印本页]

作者: 张明    时间: 2012-8-16 19:48
标题: 谁能帮我看看这个代码的问题(已解决)
本帖最后由 张明 于 2012-8-17 09:51 编辑
  1. /*  
  2. 要求输出结果:
  3.         1
  4.      1    1
  5.    1   2   1
  6.   1  3  3   1
  7. 1  4  6  4   1
  8. 下一行的数字等于其肩上的两个数字之和
  9. */
  10. class Shuzu
  11. {
  12. public static void main(String[] args)
  13. {
  14. int[] x=new int[15];
  15. int[] y=new int[15];
  16. x[6]=1;
  17. for(int i=0;i<5;i++)
  18. {
  19. if(i%2==0)//x与y交替输出
  20. {
  21. for(int j=0;j<15;j++)
  22. {
  23. if(x[j]!=0)//若为0输出/t
  24. {
  25. System.out.print(x[j]);
  26. if(j>=1)
  27. {
  28. y[j]=x[j]+x[j-1];//下面的数组的值等于上面相邻两个的和
  29. y[j]=x[j]+x[j+1];
  30. }
  31. }
  32. else
  33. {
  34. System.out.print("\t");
  35. }
  36. }
  37. System.out.println();
  38. }
  39. else
  40. {
  41. for(int j=0;j<15;j++)
  42. {
  43. if(y[j]!=0)
  44. {
  45. System.out.print(y[j]);
  46. if(j>=1)
  47. {
  48. x[j]=y[j]+y[j-1];//下面的数组的值等于上面相邻两个的和
  49. x[j]=y[j]+y[j+1];
  50. }
  51. }
  52. else
  53. {
  54. System.out.print("\t");
  55. }
  56. }
  57. System.out.println();
  58. }
  59. }
  60. }
  61. }


复制代码
运行的结果我是淡定不住了,求助啊

作者: 张明    时间: 2012-8-16 20:17
这个问题大家不能帮到我吗?
作者: 张明    时间: 2012-8-16 22:17
此题无人能解?
作者: 黑马_许芸    时间: 2012-8-16 23:42
额,花了半个小时时间做出来了,应该还比较好懂吧,你看看。建议从main方法开始看起。然后再看前面这个建塔的方法。

public class NumberTower
{
        public static void towerBuild(int n,int[][] arr)
        {
                int mid = (2*n-1)/2;
               
                int[][] key = new int[n][2]; //这个数组用来记录每一行中,值为1的元素的下标
               
                //把三角形的两条边完成
               
                arr[0][mid] = 1;
               
                int midLeft = mid;
                int midRight = mid;
               
                for (int i = 1; i < n; i++)
                {
                        arr[i][--midLeft] = 1;
                        arr[i][++midRight] = 1;
                        key[i][0] = midLeft;
                        key[i][1] = midRight;
                }
               
                //开始完成三角形内部,使得每个元素的值都是它的两肩上的值的和
               
                for (int i = 2; i < n; i++)     //从第三行的元素开始,因为第二行没有元素有两个肩
                {
                        for (int j = key[i][0]+2; j < key[i][1]; j=j+2)
                        {
                                arr[i][j] = arr[i-1][j-1] + arr[i-1][j+1];   //应该看得懂吧,等号右边这两个元素,就是所谓的两个肩膀啦。
                        }
                }
        }
       
        public static void main(String[] args)
        {
                int n = 5;
                int[][] arr = new int[n][2*n-1];
               
                //先将这个数组全部赋值为0,为了方便在打印的时候与那些非0的元素区分开
                for (int i = 0; i < n; i++)
                {
                        for (int j = 0; j < 2*n-1; j++)
                        {
                                arr[i][j] = 0;
                        }
                }
               
                towerBuild(n,arr);
               
                //打印这个数组,不过值为0的元素用空格代替
                for (int i = 0; i < n; i++)
                {
                        for (int j = 0; j < 2*n-1; j++)
                        {
                                if (arr[i][j] == 0)
                                {
                                        System.out.print(" ");
                                }else {
                                        System.out.print(arr[i][j]);
                                }
                        }
                        System.out.println();
                }
        }
}


作者: 黑马_许芸    时间: 2012-8-16 23:45
    1   
   1 1   
  1 2 1  
1 3 3 1
1 4 6 4 1

这是我用eclipse运行出来的结果。源代码见附件。

NumberTower.zip

862 Bytes, 下载次数: 78


作者: 张明    时间: 2012-8-17 09:43
黑马_许芸 发表于 2012-8-16 23:45
1   
   1 1   
  1 2 1  

谢谢你的回复。
你的代码我看了,可以成功运行
你的想法可能和我有点不同吧,这个三角还可以拆分了来实现啊,哈哈
你定义的是一个要足够大的二维数组,这一个数组装下所有的东西,但是这个数组中很多元素都是没有数据的
这个题,原本是让用户来输入行数,我还没学到输入这块,所以我改了一下,如果用户输入一个稍大一点的行数话,这个定义二维数组和我想的用两个一维数组来实现,差距就很大了
两个数组轮流交替使用,在内存中就只相当于开辟了两行数组的内存,你的这个的话就需要开辟用户输入行内存了
昨天我也又研究了半个小时,终于找到了问题所在,代码附上,你也看看,在交流交流
  1. /* 1
  2. 1 1
  3. 1 2 1
  4. 1 3 3 1
  5. 1 4 6 4 1
  6. 下一行的数字等于其肩上的两个数字之和
  7. */
  8. class Shuzu
  9. {
  10. public static void main(String[] args)
  11. {
  12. int[] x=new int[15];
  13. int[] y=new int[15];
  14. x[6]=1;
  15. for(int i=0;i<5;i++)
  16. {
  17. if(i%2==0)//x与y交替输出
  18. {
  19. for(int j=0;j<15;j++)
  20. {
  21. if(x[j]!=0)//若为0输出/t
  22. {
  23. System.out.print(x[j]);
  24. if(j>=1)
  25. {
  26. y[j+1]=x[j]+x[j+2];//下面的数组的值等于上面相邻两个的和
  27. y[j-1]=x[j]+x[j-2];
  28. }
  29. }
  30. else
  31. {
  32. System.out.print(" ");
  33. }
  34. }
  35. System.out.println();
  36. }
  37. else
  38. {
  39. for(int j=0;j<15;j++)
  40. {
  41. if(y[j]!=0)
  42. {
  43. System.out.print(y[j]);
  44. if(j>=1)
  45. {
  46. x[j+1]=y[j]+y[j+2];//下面的数组的值等于上面相邻两个的和
  47. x[j-1]=y[j]+y[j-2];
  48. }
  49. }
  50. else
  51. {
  52. System.out.print(" ");
  53. }
  54. }
  55. System.out.println();
  56. }
  57. }
  58. }
  59. }


复制代码
不知道为什么,怎么发代码可以带上格式呢?






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