6

全面披露:家庭作业。

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

问题:

编写一个名为的方法,该方法printSquare接受两个整数参数 amin和 a ,并以正方形模式max打印范围 from min到inclusive 的数字。max通过示例比通过解释更容易理解方形模式,因此请查看下表中的示例方法调用及其生成的控制台输出。正方形的每一行都由一个在min和 之间递增的整数组成的循环序列组成max。每行打印此序列的不同排列。第一行以 min 开头,第二行以 开头min + 1,依此类推。当任何一行中的序列到达max时,它会绕回min. 您可以假设方法的调用者将传递 amin和 amaxmin小于或等于的 参数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 两次,但这是我可以让编译器用循环形成方形的唯一方法。有没有人远程理解我想要做什么?:/

4

7 回答 7

11

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

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));
}
于 2013-11-05T15:48:16.307 回答
3

由于这是家庭作业,我将给出一个提示。

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

这是一种方法。

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

  • 使用循环遍历数组,从元素 0 开始,以元素 4 结束,另一个循环显示 5 位数字 (max - min + 1)。

于 2013-11-05T15:35:35.210 回答
2

试试这个

    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();
    }
于 2013-11-05T15:56:27.283 回答
0

你可以试试

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

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

于 2013-11-05T15:39:22.997 回答
0

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

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

于 2013-11-05T16:00:29.577 回答
0

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

 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();
        }

    }
于 2013-11-05T16:10:02.040 回答
0
            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();
                }
                
            }
于 2016-07-28T17:12:50.237 回答