【问题标题】:Using Nested for loops to make a doubling then halfing pyramid使用嵌套的 for 循环制作一个加倍和减半的金字塔
【发布时间】:2015-01-22 21:38:50
【问题描述】:
                 1
               1 2 1
             1 2 4 2 1
           1 2 4 8 4 2 1
         1 2 4 8 16 8 4 2 1
      1 2 4 8 16 32 16 8 4 2 1
   1 2 4 8 16 32 64 32 16 8 4 2 1 
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1 

我需要使用嵌套的 for 循环来制作这个金字塔, 到目前为止,我发现我需要三个 for 循环。 我知道 for 循环是如何工作的,并且对 Java 的基础知识有很好的掌握,但我对它的工作原理一无所知。

【问题讨论】:

  • 做中间栏应该很容易。将每一行的部分一直到中间列也是如此。一旦你有了这个,只需镜像数字以获得左半部分,你就完成了。如果您首先在数组内部构建每一行并且仅在您拥有所有数字时才打印它,这可能是最简单的。使用 –1 或其他“不可能”值来标记空字段。
  • 尝试一下,然后向我们展示!
  • 我认为你实际上需要四个 for 循环。

标签: java loops for-loop nested


【解决方案1】:

只是在没有调试的情况下写了这个,但它应该会产生这个金字塔:

      0       
    0 1 0    
  0 1 2 1 0  
0 1 2 3 2 1 0

int pyramidHeight = 4;
for(int i = 0; i < pyramidHeight;i++){
  for(int j = 1; j < pyramidHeight*2;j++){
    if( j < pyramidHeight - i || j > pyramidHeight + i ){
      System.out.print(" ");

    }
    else{
      System.out.print(i - Math.abs(pyramidHeight - j));
    }
    System.out.print(" ");
  }
  System.out.println();
}

通过两个简单的改变,你应该得到你的金字塔。

【讨论】:

  • 这比你知道的更有用。我想知道执行 if 语句来切换运算符是否是该程序的关键,但在与我的实验室合作伙伴交谈后决定不这样做。谢谢
【解决方案2】:

这应该可以!请注意,您的每行总共计算 2*i+1 个元素,其中 i 是您当前的行号。

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {

        int lim = 5;
        int spaceLim = lim*2;

        for (int i=0; i < lim; i++){ // Number of rows is the key here (pow 2)

            String s = "%" + spaceLim + "s";
            System.out.printf(s, "");
            if (i == 0){
                System.out.print(1);
            }
            else{
            for (int j=0; j<i; j++) {
                System.out.printf("%1.0f ",(Math.pow(2.0, (double)(j))));
            }

            for (int j=i; j>=0; j--){
                System.out.printf("%1.0f ", (Math.pow(2.0, (double)(j))));
            }

            }
            System.out.println();
            spaceLim -= 2;
        }
    }
}

工作解决方案的演示在这里 - http://ideone.com/J2fcQw

【讨论】:

  • 我的实验室伙伴和我尝试了类似的事情,但在中间数字重复时遇到了同样的问题。除此之外它很好,但我似乎无法让它在每个 Int 之后不打印 .0 并且不打印中间数字两次。
  • @RobbieTraverseParmentier 它不打印任何重复的中间数字。我实际上很喜欢 moloney55 的解决方案,因为他只使用了 1 个 for 循环,但上面的算法具有 O(N) 缩放,即总共 N 行要处理以获得金字塔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多