【问题标题】:Creating a looping square with java用java创建一个循环方块
【发布时间】:2013-11-05 15:27:03
【问题描述】:

全面披露:家庭作业。

解释:我听不懂我的老师。

问题:

编写一个名为printSquare 的方法,它接受两个整数 参数,一个min 和一个max,并打印范围从 minmax 包括方形图案。正方形图案是 通过例子比解释更容易理解,所以看看 示例方法调用及其生成的控制台输出在 下表。正方形的每一行由一个圆形序列组成 在minmax 之间增加整数。每行打印一个 这个序列的不同排列。第一行以 分钟,第二行以min + 1 开头,依此类推。当。。。的时候 任何一行中的序列到达max,它会回绕回min。你 可能假设该方法的调用者将传递一个min 和一个max 参数使得min 小于或等于max

我终其一生都无法弄清楚如何让数字停止在“最大值”处并在行的中间重新开始。

这是我目前所拥有的,很抱歉,但我遇到了 for 循环问题。

for(int i = 0; i < row; i++)
{
    for(int d = 0; d < row; d++)
    {
        System.out.print(d+1);
    }
    System.out.println(i);
}

我知道我使用了 row 两次,但这是我可以让编译器使用循环形成方形的唯一方法。有没有人远程理解我想要做什么? :/

【问题讨论】:

  • 我知道我用了 row 两次 然后你明白你应该在其中一个 for 循环中使用另一个变量而不是 row,重新阅读作业练习和多想想吧。
  • 想想每一行的“虚拟”起始索引。如果第一行从 0 开始(即0 + 10 + 2 等)第二行从什么开始?
  • 如果你有一支笔和一张纸,会怎么做?一旦你弄清楚了,就告诉计算机做同样的事情。
  • 我建议不要使用循环的变量作为打印值,你知道这些值在这个过程中不会改变,有更好的选择。
  • @LuiggiMendoza 我一直在寻找这个问题一段时间。我需要一个解释。我老师的第二语言是英语,在我们试图相互理解的过程中出现了故障。

标签: java loops


【解决方案1】:

这实际上是一个很好的数学问题。假设:

int side = to - from + 1; /// the size/width of the square.

正方形(行、列)任意点的值为:

from + ((row + col) % side)

你应该能够把它放在你的循环中并“抽它”。


根据要求解释的评论进行编辑。

诀窍是遍历“矩阵”中的所有位置。鉴于矩阵是方形的,循环相对简单,只有两个循环(嵌套)遍历系统:

    final int side = to - from + 1;
    for (int row = 0; row < side; row++) {
        for(int col = 0; col < side; col++) {
            ... magic goes here....
        }
    }

现在,在这个循环中,我们有变量rowcol,它们表示我们感兴趣的矩阵中的单元格。该单元格中的值需要与它与原点的距离成正比。 ....让我解释一下....如果原点是左上角(它是),那么到原点的距离是:

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

距离是行列之和……(行列从0开始计数)。

我们在每个矩阵中输入的值都被限制在一个固定的范围内。对于上面的示例,对于大小为 5 的正方形,可以将其指定为 printSquare(1,5)

每个单元格中的值是起始值(在本例中为 1)加上到原点的距离...天真地,这看起来像:

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9

这里单元格中的值已经超过了 5 的限制,我们需要将它们包裹起来......所以,诀窍是“包裹”到原点的距离......和“模”运营商非常适合这一点。首先,考虑原始的“原点距离”矩阵:

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

如果我们用“除以 5 时的余数”(模 5 或 %5)填充这个矩阵,我们得到矩阵:

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

现在,如果我们将这个“模”结果添加到 from 值 (1),我们将得到最终矩阵:

1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4

从某种意义上说,你只需要知道每个单元格的值是:

the from value plus the remainder when you divide the 'distance' by the width.

这是我测试的代码:

public static final String buildSquare(final int from, final int to) {
    final StringBuilder sb = new StringBuilder(side * side);

    final int side = to - from + 1;

    for (int row = 0; row < side; row++) {
        for(int col = 0; col < side; col++) {
            sb.append( from + ((row + col) % side) );
        }
        sb.append("\n");
    }
    return sb.toString();

}

public static void main(String[] args) {
    System.out.println(buildSquare(1, 5));
    System.out.println(buildSquare(3, 9));
    System.out.println(buildSquare(5, 5));
    System.out.println(buildSquare(0, 9));
    System.out.println(buildSquare(0, 3));
}

【讨论】:

  • 使用remainder (modulus) operator 定期计数是一个非常聪明的解决方案!不错!
  • 我想您不会花时间为我详细解释一下吗?我最终没有通过这个问题,因为我没有按时提交。我想了解更多,而不是做对,所以我没有注意作业时钟。 :3
  • 没问题,完成。祝你学习顺利。郑重声明,这是一个“很好”的问题,它有一个很好的数学部分,并且在程序中是一个“优雅”的解决方案。这是一个很好的任务。我必须记住这一点。
【解决方案2】:

既然是作业,我就给个提示吧。

我终其一生都无法弄清楚如何使数字停在“最大值”处并在行的中间重新开始。

这是一种方法。

  • 在数组中创建两次第一个数字。以printSquare(1, 5)为例,创建一个1、2、3、4、5、1、2、3、4、5的int数组。

  • 使用循环遍历数组,从元素 0 开始到元素 4 结束,另一个循环显示 5 位数(最大值 - 最小值 + 1)。

【讨论】:

    【解决方案3】:

    试试这个

        int i,j,k;
        for(i=min;i<=max;i++) {
            for(j=i;j<=max;j++) {
                System.out.print(j);
            }
            for(k=min;k<i;k++){
                System.out.print(k);
            }
            System.out.println();
        }
    

    【讨论】:

      【解决方案4】:

      你可以试试

      1. 从最小值循环到最大值并将所有数字放入数组中
      2. 现在再次从最小值循环到最大值

        每次打印数组并进行循环移位(对于循环移位,您可以在 SO 中找到很多示例)

      【讨论】:

        【解决方案5】:

        我认为@rolfl 的解决方案是最干净的。我建议你这样做。

        您可以通过观察“正方形”中的每个输出简单地将第一个元素移动到数字列表的末尾来找到另一个简单的解决方案。为了模仿这一点,您可以将所有从minmax 的数字放入LinkedListArrayDeque 这样的数据结构中,您可以轻松地从两端添加/删除项目,然后将内容打印在顺序,并将第一个条目 shift 移到末尾。例如,coll.addLast(coll.removeFirst())。如果你重复这个过程max - min + 1 次,你应该得到想要的输出。

        【讨论】:

          【解决方案6】:

          没有数组没有问题你可以轻松解决。 它适用于任何数字范围。

           static void printSquare(int min, int max){
                  int len = max - min + 1;
                  int copy_min = min,  permanent_min = min;
                  for(int i = 0; i < len; i++){
                      for(int j = 0; j< len; j++){
                          if(min > max)
                              if(min % len < permanent_min)
                                  System.out.print((min % len )+ len);
                              else
                                  System.out.print(min % len);
                          else
                              System.out.print(min);
                          min++;
                      }
                      min = ++copy_min;
                      System.out.println();
                  }
          
              }
          

          【讨论】:

            【解决方案7】:
                        public static void printSquare(int min, int max)  {
                            
                            for (int i = min; i <= (max -min)+min; i++)  {
                                
                                for( int j =i; j <= max ; j++) {                
                                    System.out.print(j);   
                                    } 
                                for (int j1= min; j1<= i * 1 - 1; j1++) {
                                    System.out.print(j1);
                                    }
                                System.out.println();
                            }
                            
                        }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-10-14
              • 2011-09-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多