如何以弗洛伊德的三角形图案曲折数字?

时间:2018-06-28 12:50:22

标签: java

我找到了一种曲折矩阵的方法,但我愿意为三角形图案找到与干净代码相同的方法。

示例:- 输入= 3

1
32
456

我已经在此处编码了编号的矩阵代码

int k=0;
int t=1;
int n=4;

for(int i=0;i<n;i++){

    for(int j=0;j<n;j++){
        k+=t;
        System.out.print(k);
    }
    k=k+n+t;
    t=-t;
    System.out.println();
}

1234
8765
9101112
16151413

4 个答案:

答案 0 :(得分:2)

    int n = 6;
    int num = 0;
    int step = 1;

    for (int i = 1; i <= n; i++) {
        // num : (i² - i + 2)/2 .. same + i - 1
        for (int j = 0; j < i; j++) {
            num += step;
            System.out.print(num);
            System.out.print(' ');
        }
        num += i + (1 + 3*step)/2;
        step = -step; // zig resp. zag
        System.out.println();
    }

有用的是将 i 编号为精确包含 i 元素的行。

屈服

1 
3 2 
4 5 6 
10 9 8 7 
11 12 13 14 15 
21 20 19 18 17 16 

问题是i号的每一行i的最小值都是(i² - i + 2)/2, 对于 next 之字形,第一步需要考虑以下步骤。

从最后一行到下一行的第一行有两种情况:

  • 步骤-1
  • 第1步

这两种情况的两种公式都可以通过该步骤统一。

step   i   num
  +    1   1 -> 4     += i + 2
  -    2   2 -> 3     += i - 1
  +    3   6 -> 11    += i + 2
  -    4   7 -> 10    += i - 1

答案 1 :(得分:1)

以下将起作用:

public static void zigZag(int rows) {
    int current = 1;
    int increment = 1;
    for (int row = 1; row <= rows; row++) {
        int width = row + current;
        for (int element = current; element < width; element++) {
            System.out.print(current);
            current+=increment;
        }
        System.out.println();
        current += row + 0.5 - (0.5*increment);
        increment = -increment;
    }
}

编辑:只是一个注释,因为我怀疑您的问题可能是出于家庭作业的动机,因此,如果您能够了解正在发生的事情而不仅仅是复制粘贴,可能会有所帮助。

真正需要更改的是在内部循环中使用外部循环变量(最初创建矩阵正方形的那个变量,我称为行),该变量打印行的各个元素。

然后将其用于计算下一行的第一个元素。增量值的作用与原始值相同,但现在它也可以用于使之字形模式以非1的整数递增。

答案 2 :(得分:1)

从三角形(1)的顶部开始,将是第1行,所有随后的偶数行将反向打印。知道您可以尝试这样的事情:

public class StackOverflow {
    public static void main(String[] args) {
        int triangleSize = 5;
        int counter = 1;
        int rowSize = 1;
        for (int i = 1; i <= triangleSize; i++) {
            if (i % 2 == 0) {
                // Reverse number sequence
                int reverseCounter = counter + rowSize - 1;
                for (int j = 0; j < rowSize; j++) {
                    System.out.print(reverseCounter--);
                    counter++;
                }
            } else {
                for (int j = 0; j < rowSize; j++) {
                    System.out.print(counter++);
                }
            }
            System.out.println("");
            rowSize++;
        }
    }
}

保持跟踪您所在的行(rowSize)和您所在的值(计数器)。当您在偶数行上时,必须从该行将具有的最大值开始,并从该行开始倒数,但仍要增加普通计数器的值(int reverseCounter = counter + rowSize + 1)。

结果:

1
32
456
10987
1112131415

答案 3 :(得分:0)

尝试这个,我为您编码

public class TriangleNum{
  public static void main(String[] args) {
    getTringle(5);
  }

  public static void getTringle(int j){
    for (int i =0; i<j;i++) {
      System.out.print(i+ "\r" );
      for (int k =0; k<i;k++) {
        System.out.print(k+ "\t" );
      }
    }
  }
}