Estou com problemas para resolver esta questão

Criar uma função que recebe 2 parâmetros
Número de linhas N
Número de colunas M

e retorna uma matriz NxM, onde
M[i][j] = 0, se i<j
(i+j)*2 caso contrario

Exemplo para N=5 e M=4

0 0 0 0
1 4 0 0
4 9 16 0
9 16 25 36
16 25 36 49 eu tentei escrever um codigo baseado nessas informações segue ele abaixo mas n to chegando ao resultado

static int [][] matrizMN(int M, int N){

int matriz[][] = new int [M][N];
     
    for (int i=0; i<matriz.length; i++){
        for (int j=0; j<matriz[0].length; j++){
        matriz[i][j] = (int )(j+i)*2;
        }
    }
return matriz;
}

public static void main(String[] args) {
    int v[][] = matrizMN(5,4);
    for (int i=0; i<v.length; i++)
    System.out.println(Arrays.toString(v[i]));
}

}

Só faltou vc adicionar a lógica dentro dos loops. Seria algo assim:

if (i < j)
  matriz[i][j] = 0;
else
  matriz[i][j] = (i + j) * 2;

Ou tudo numa linha só:

matriz[i][j] = i < j ? 0 : (i + j) * 2;

Só que com essa lógica vc nunca vai conseguir o resultado que vc quer. No resultado que vc mostrou há numeros impares, mas qualquer multiplicação por 2 vai resultar num número par.

Ou seja, sempre vai sair 0 ou um número par.

E com 5 linhas e 4 colunas, o máximo que vc vai conseguir é o valor 14.

i = 4;
j = 3;
i + j = 7;
7 * 2 = 14;

Será que não está faltando informação?

Experimenta colocar um print dentro dos loops pra vc acompanhar o que acontece passo a passo:

for (int i = 0; i < matriz.length; i++) {
  for (int j = 0; j < matriz[0].length; j++) {
    matriz[i][j] = i < j ? 0 : (i + j) * 2;
    System.out.printf("i: %d, j: %d, result: %d\n", i, j, matriz[i][j]);
  }
}

E na hora de apresentar a matriz, experimenta isso pra ficar mais facil de ler e interpretar:

int v[][] = matrizMN(5, 4);

for (int i = 0; i < v.length; i++) {
  for (int j = 0; j < v[0].length; j++)
    System.out.printf("%3d", v[i][j]);
  System.out.println();
}

Os resultados apresentados no exemplo não são multiplicação por 2 mas sim quadrados. E não precisas do if, a matriz já é inicializada com todos os valores a zero, basta preencher os restantes:

for (int i = 0; i < matriz.length; i++) {
  for (int j = 0; j <= i; j++) {  // só queremos preencher até j=i, a partir daqui é zero porque i<j
    matriz[i][j] = (i + j) * (i + j);  // assumi quadrado pelo exemplo. Se for realmente *2, é só trocar aqui
  }
}
1 curtida

Nossa, bem observado!

O problema que eu vi é que se vc colocar j <= i vai causar um java.lang.ArrayIndexOutOfBoundsException se i for maior que j.

Para corrigir eu pensei em 2 formas. Assim:

static int[][] matrizMN(int M, int N) { // @formatter:off
  int[][] matriz = new int[M][N];

  for (int i = 0; i < M; i++) {
    for (int j = 0; j <= i; j++) {
      if (j == N) break;
      matriz[i][j] = (i + j) * (i + j);
    }
  }

  return matriz;
}

Ou assim:

static int[][] matrizMN(int M, int N) {
  int[][] matriz = new int[M][N];

  for (int i = 0; i < M; i++) {
    for (int j = 0; j < N; j++) {
      if (i >=j)
        matriz[i][j] = (i + j) * (i + j);
    }
  }

  return matriz;
}

Certo, eu estava somente a pensar em matrizes quadradas.

for (int j = 0; j < N && j<=i; j++) {
1 curtida

Mais elegante assim :wink:

obrigado, n tinha me dado conta deste detalhe

obrigado, faz sentido eu n tinha me dado conta deste detalhe