Escreva um algoritmo que leia uma matriz de tamanho 3 x 3 e, ao final, imprima se esta matriz é ou não um quadrado mágico…
Fiz o programa mas ele não obedece a estrutura condicional para informar que o quadrado é mágico .
Segue código…
package matrizes;
/* Um quadrado mágico é uma matriz quadrada
em que a soma das suas linhas é igual
a soma das sua colunas e que também é
igual a soma da diagonal principal e da
diagonal secundária. A matriz abaixo é um
de quadrado mágico, pois a somatória, em todos os
casos, é igual a 15. Escreva um algoritmo que
leia uma matriz de tamanho 3 x 3 e, ao final, imprima
se esta matriz é ou não um quadrado mágico
*/
import java.util.Scanner;
public class Questao13 {
public static void main(String[] args) {
int[][] num = new int[3][3];
int somaLinha = 0, somaColuna = 0, somaDiagonal = 0;
int diagonal2 = 0;
Scanner input = new Scanner(System.in);
// SOMAR AS LINHAS
System.out.println("Informe os números:");
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length; j++) {
num[i][j] = input.nextInt();
somaLinha = somaLinha + num[i][j];
}
}
// SOMAR AS COLUNAS
for (int j = 0; j < num.length; j++) {
for (int i = 0; i < num.length; i++) {
somaColuna = somaColuna + num[j][i];
}
}
// SOMAR A DIAGONAL PRINCIPAL
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length; j++) {
if (i == j) {
somaDiagonal = somaDiagonal + num[i][j];
}
}
}
// SOMAR DIAGONAL INTERNA
for (int i = 0; i < num.length; i++) {
for (int j = num.length ; j > 0; j--) {
if (i == j) {
diagonal2 = diagonal2 + num[i][j];
}
}
}
if ((somaLinha == somaColuna) && (somaColuna == somaDiagonal) && (somaDiagonal == diagonal2)) {
System.out.println(" É um quadrado mágico!! ");
} else {
System.out.println(" Não é um quadrado mágico!! ");
}
}
}
Informe os números:
2
2
2
2
2
2
2
2
2
Não é um quadrado mágico!!
Não precisa percorrer várias vezes a matriz, dá pra fazer tudo de uma vez:
public static boolean verificaQuadradoMagico(int[][] arr) {
int somaPrimeiraLinha = 0, somaOutrasLinhas = 0, somaColuna = 0, somaDiagonal = 0, somaDiagonalSec = 0;
for (int i = 0; i < arr.length; i++) {
somaDiagonal += arr[i][i];
somaDiagonalSec += arr[i][arr.length - i - 1];
for (int j = 0; j < arr.length; j++) {
if (arr.length != arr[i].length) {
return false; // tamanho diferente, não é matriz quadrada
}
if (i == 0) {
somaPrimeiraLinha += arr[i][j];
} else {
somaOutrasLinhas += arr[i][j];
}
somaColuna += arr[j][i];
}
// aqui eu terminei a linha, então se não for a primeira, eu comparo as somas
if (i > 0 && somaOutrasLinhas != somaPrimeiraLinha) {
return false; // se deu diferente, já sei que não é
}
// aqui também terminou a coluna
if (somaPrimeiraLinha != somaColuna) {
return false; // se deu diferente, já se que não é
}
somaColuna = somaOutrasLinhas = 0; // zera, para somar a próxima linha e coluna
}
// é mágico se a soma da primeira linha for igual a soma das diagonais
return somaPrimeiraLinha == somaDiagonal && somaPrimeiraLinha == somaDiagonalSec;
}
Eu calculo a soma da primeira linha, e depois comparo com a soma das outras linhas, colunas e das diagonais. Se no meio encontrar alguma diferente, interrompo o loop (não faz sentido continuar se já encontrei uma soma diferente). Também coloquei uma verificação de tamanho, só para garantir que a matriz é quadrada mesmo.
Agora é só usar este método:
int[][] num = new int[3][3];
// ler os números com Scanner, etc
if (verificaQuadradoMagico(num)) {
System.out.println(" É um quadrado mágico!! ");
} else {
System.out.println(" Não é um quadrado mágico!! ");
}
import java.util.Scanner;
public class QuadradoMagico {
public static void main(String[] args) {
int[][] matriz = new int[3][3];
Scanner sc = new Scanner(System.in);
// Lê a matriz
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
System.out.printf("Informe o elemento da posição [%d][%d]: ", i, j);
matriz[i][j] = sc.nextInt();
}
}
// Calcula a soma da primeira linha
int soma = matriz[0][0] + matriz[0][1] + matriz[0][2];
// Verifica as outras linhas
for(int i = 1; i < 3; i++) {
int somaLinha = matriz[i][0] + matriz[i][1] + matriz[i][2];
if(somaLinha != soma) {
System.out.println("A matriz não é um quadrado mágico.");
return;
}
}
// Verifica as colunas
for(int j = 0; j < 3; j++) {
int somaColuna = matriz[0][j] + matriz[1][j] + matriz[2][j];
if(somaColuna != soma) {
System.out.println("A matriz não é um quadrado mágico.");
return;
}
}
// Verifica as diagonais
int somaDiagonal1 = matriz[0][0] + matriz[1][1] + matriz[2][2];
int somaDiagonal2 = matriz[0][2] + matriz[1][1] + matriz[2][0];
if(somaDiagonal1 != soma || somaDiagonal2 != soma) {
System.out.println("A matriz não é um quadrado mágico.");
return;
}
System.out.println("A matriz é um quadrado mágico.");
}
}