我正在做一项作业,该作业需要一个带有数字矩阵的数据文件并确定它是否是幻方。如果是,那么它还需要报告行和列的总和。输出:
矩阵是一个幻方。 所有行和列的总和是 34。
我不知道如何用一种方法来解决这个问题,我觉得它要求我返回 2 个值。我最接近的方法是在返回 true 时在方法末尾添加一个带有总和的 System.out.println。
但问题是我的输出是反词:
所有行和列的总和是 34。 该矩阵是一个幻方。
当我只被要求创建一种方法时,如何获得总和?下面是我的代码,老师给出了最后 3 个方法,所以我只关心前 2 个。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class chp8magic
{
public static void main(String args[])
{
int matrix[][] = initMatrix();
printData(matrix);
if (isMagic(matrix)) {
System.out.println("The matrix is a magic square.");
}
else {
System.out.println("Not a magic square");
}
}
public static boolean isMagic(int[][] mat)
{
int n = mat.length;
int nSquare = n*n;
int M = (n*n*(n*n+1)/2)/n;
int sumRow = 0, sumColoumns = 0, sumPriDiag = 0, sumSecDiag = 0;
boolean[] flag = new boolean[n*n];
for(int row = 0; row < n; row++){
sumRow = 0;
sumColoumns = 0;
for(int col = 0; col < n; col++)
{
if( mat[row][col] < 1 || mat[row][col] > nSquare )
return false;
if(flag[mat[row][col]-1] == true)
return false;
flag[mat[row][col]-1] = true;
sumRow += mat[row][col];
sumColoumns += mat[col][row];
}
sumPriDiag += mat[row][row];
sumSecDiag += mat[row][n-row-1];
if(sumRow!=M || sumColoumns!=M)
return false;
}
if(sumPriDiag!=M || sumSecDiag!=M)
return false;
else
return true;
}
public static int[][] initMatrix()
{
int matrix[][];
Scanner filein = null;
try {
filein = new Scanner(new File("matrix.txt"));
int numRows = Integer.parseInt(filein.nextLine());
matrix = new int[numRows][];
parseData(matrix, filein);
filein.close();
return matrix;
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
if(filein != null)
filein.close();
return null;
}
}
public static void parseData(int matrix[][], Scanner in)
{
for(int r = 0; r < matrix.length; r++)
{
String splitLine[] = in.nextLine().split(" ");
matrix[r] = new int[splitLine.length];
for(int c = 0; c < matrix[r].length; c++){
matrix[r][c] = Integer.parseInt(splitLine[c]);
}
}
}
public static void printData(int matrix[][])
{
for(int r = 0; r < matrix.length; r++){
for(int c = 0; c < matrix[r].length; c++){
System.out.print(matrix[r][c] + " ");
}
System.out.println();
}
}
}
最佳答案
也许你只需要这样做:
System.out.println("is magic: " + isMagic);
System.out.ptintln("sum: " + sum);
然而,这并没有真正返回值,只是打印它们。要返回两个值,有多种选择。您可以返回一个对象:
public class MagicSquareProperties {
private boolean magic;
private int sum;
public MagicSquareProperties(boolean magic, int sum) {
this.magic = magic;
this.sum = sum;
}
public boolean isMagic() {
return magic;
}
public int getSum() {
return sum;
}
}
// now to return both values: return new MagicSquareProperties(true, 34);
但在我看来,最好的解决方案如下:
- 创建一个 MagicSquare 类。
- 添加属性声明(例如 private int sum)。
- 添加一个构造函数,例如 MagicSquare(File file),该构造函数读取文件并填充属性。
- 根据需要添加 getter 和 setter(例如 getSum())
- 执行另一个类中的main方法并调用new MagicSquare(...)来创建一个幻方对象。之后,您可以在需要该值时调用该对象的 getter。
关于java - Magic Square Method 需要输出是否是幻方以及行列之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29616974/