嵌套的循环模式

时间:2014-03-20 05:13:35

标签: java loops nested

我一直在努力解决Java中的循环模式(两边都有空格)

   0
  000
 00000
0000000
 00000
  000
   0

这是我一直在做的事情:

for (int i = 1; i <= 5; i++) {
        for (int s = 5; s > i; s--) {
            System.out.print(" ");
        }
        for (int j = 1; j < i; j++) {
            System.out.print("0");
        }
        for (int j = 1; j < i; j++) {
            System.out.print("0");
        }
        System.out.println("");
    }
    for (int i = 1; i <= 5; i++) {
        for (int s = 1; s < i; s++) {
            System.out.print(" ");
        }
        for (int j = 5; j > i; j--) {
            System.out.print("0");
        }
        for (int j = 5; j > i; j--) {
            System.out.print("0");
        }
        System.out.println("");
    }

正如您可能已经知道的那样,我已经能够弄清楚如何使用每行中奇数个0来打印此模式,但我无法为我的生活做准备弄清楚如何用奇数来做。谢谢。

4 个答案:

答案 0 :(得分:2)

有时候有点参数化问题会有所帮助;然后你可以把它写在纸上,看看是否有任何模式。例如,在您想要的输出中:

   0
  000
 00000
0000000
 00000
  000
   0

首先,让我们选择一种方便的方式来描述一行。让我们说一行is个空格后跟z个零,整个模式可以是rows行。{现在把它写出来。当rows为7时

i s z
0 3 1
1 2 3
2 1 5
3 0 7
4 1 5
5 2 3
6 3 1

如果rows是5,那该怎么样?

i s z
0 2 1
1 1 3
2 0 5
3 1 3
4 2 1

偶数怎么样?我们必须选择我们想要它的样子,如何:

  00
 0000
000000
000000
 0000
  00

所以,当rows为6时:

i s z
0 2 2
1 1 4
2 0 6
3 0 6
4 1 4
5 2 2

好的,现在,让我们寻找模式吧! z很简单:我们可以从数字和视觉上看到zsrows的函数:

z = rows - (2 * s);

也就是说,我们知道总宽度等于高度(行),我们知道在零之前和之后有相同数量的空格。

现在归结为从si找出rows。好吧,经过一些头脑刮擦和实验,我们可以看到i < rows / 2

s = (rows - 1) / 2 - i;

i >= rows / 2

s = i - rows / 2;

现在,这一切都在一起,例如:

void diamond (int rows) {
   for (int i = 0; i < rows; ++ i) {
       int s;
       if (i < rows / 2)
           s = (rows - 1) / 2 - i;
       else
           s = i - rows / 2;
       int z = rows - (2 * s);
       // print s spaces, then z zeroes, then a newline
   }
}

我将打印s空格和z零的任务作为练习留给读者。

对于此类问题,这是一种相当普遍的问题解决方法:

  1. 参数化。
  2. 写下来。
  3. 寻找模式。
  4. 第1步是最重要的一步,因为它定义了一种方法,可以将复杂的任务(绘制钻石)转换为更简单的问题(将s确定为i的函数, rows)。

答案 1 :(得分:1)

你可以尝试这个 -

 for (int i = 1; i < 10; i += 2) {
  for (int j = 0; j < 9 - i / 2; j++)
    System.out.print(" ");

  for (int j = 0; j < i; j++)
    System.out.print("*");

  System.out.print("\n");
}

for (int i = 7; i > 0; i -= 2) {
  for (int j = 0; j < 9 - i / 2; j++)
    System.out.print(" ");

  for (int j = 0; j < i; j++)
    System.out.print("*");

  System.out.print("\n");
}
}

答案 2 :(得分:1)

试试这个,

public static void main(String []args){
    int i = -1;
        for (int j = 0; j < 7; j +=2) {
            i++;
            for (int k = i; k < 3; k++) 
                System.out.print(" "); 
            for (int z = 0; z <= j; z++) {
                System.out.print(0);
            }
            System.out.println();
        }
    i=0;    
    for(int j=4; j>=0;j-=2){
        i++;
        for(int k=0;k<i;k++)
            System.out.print(" ");
        for(int z=0;z<=j ;z++)
            System.out.print(0);
        System.out.println();
    }
}

答案 3 :(得分:0)

如何将第一个j=1更改为j=2并将第一个j=5更改为j=4,以便从每个循环中减少一个?< / p>