Java:对主对角线上方和下方形成的三角形的所有元素求和

时间:2018-01-18 21:31:10

标签: java matrix

我必须将二次矩阵中主对角线上方和下方形成的每个三角形相加,然后从下面的一个中减去上面的一个,例如,如果我有一个像这样的矩阵:

enter image description here

我想计算:

第一个三角形:4 - 4 = 0

第二个三角形:(4 + 4 + 5) - (4 + 3 + 1)= 6

第三个三角形:(4 + 4 + 5 + 1 + 3 + 3) - (4 + 3 + 1 + 2 + 2 + 5)= 4

到目前为止,我想出了这个,它将计算对角线下方和上方三角形的所有元素。

  

我不知道如何为每个形成的三角形做到这一点,这是我的问题

   public static void main(String...args) {

       Scanner scanner = new Scanner(System.in);
       System.out.print("Enter rows/cols : ");    //rows and 
      columns in matrix must be same.
       int rows = scanner.nextInt();
       int columns=rows;
       int[][] matrix = new int[rows][rows];

       System.out.println("Elements of matrix :");
       for (int i = 0; i < rows; i++) {
              for (int j = 0; j < columns; j++) {
                    matrix[i][j] = scanner.nextInt();
              }
       }

       //Logic to calculate sum of elements above diagonal.
       int sum=0;
       for (int j = 1; j < columns; j++) {
              for (int i=j-1 ; i>=0 ; i--) {
                    sum= sum + matrix[i][j];
              }

       }

       int sumBelow=0;
       for (int i = 1; i < rows; i++) {
              for (int j=i-1 ; j>=0 ; j--) {
                    sumBelow= sumBelow+ matrix[i][j];
              }

       }

       System.out.println("\Matrix is : ");
       for (int i = 0; i < rows; i++) {
              for (int j = 0; j < columns; j++) {
                    System.out.print(matrix[i][j] + " ");
              }
              System.out.println();
       }

       System.out.println("sum above: "+sum);
       System.out.println("suma below: " + sumBelow );

       int subtract;
       if(sum > sumBelow) {
           razlika = sum - sumBelow;
           System.out.println("Subtracted: " + subtract);
       }else {
           subtract= sumBelow- sum;
           System.out.println("Subtracted: " + subtract);

       }



}

我得到的是......

enter image description here

请注意,除了普通数组,没有预定义的方法,包装或任何东西,我不能使用任何东西。

1 个答案:

答案 0 :(得分:2)

在由(row,col)对索引的矩阵中,考虑col-row差异的值:

     0  1  2  3  4
   -------------
0 |  0  1  2  3  4
1 | -1  0  1  2  3
2 | -2 -1  0  1  2
3 | -3 -2 -1  0  1
4 | -4 -3 -2 -1  0

注意主对角线以上(col-row)的值是如何高于某个正数,低于主对角线以下的单元的低于某个负数。

您可以使用索引的此属性来添加相应对角线下方或上方的值:

int addUp(int[][] matrix, int N, int diag) {
    int sum = 0;
    for (int row = 0 ; row != N ; row++) {
        for (int col = 0 ; col != N ; col++) {
            int d = col-row;
            if (d >= diag || d <= -diag) {
                sum += matrix[row][col];
            }
        }
    }
    return sum;
}

计算第二个对角线上方和下方元素总和的调用如下所示:

int res = addUp(matrix, 5, 2);

其中5是矩阵边长,2是从中间算起的第二个对角线。