幻方最终值始终为真
Magic Square final value always true
对于class,我们必须做一个幻方。我的代码有点工作,但它有多个正方形,最后一个总是 returns 0,这是幻方的工作原理。
这是我检查的方式
public int downDiagSum() {
int sum = 0;
for(int r = 0; r < grid.length; r++){
for(int c = 0; c < grid.length; c++){
sum += grid[r][c];
}
}
return sum;
public int upDiagSum() {
int sum = 0;
for(int r = grid.length - 1; r >= 0; r--){
for(int c = 0; c < grid.length; c++){
sum += grid[r][c];
}
}
return sum;
public int colSum(int col) {
int sum1 = 0;
for(int r = 0; r < grid[0].length; r++){
sum1 += grid[r][col];
}
return sum1;
public int rowSum(int row) {
int sum2 = 0;
for(int r = 0; r < grid[0].length; r++){
sum += grid[row][r];
}
return sum2;
public boolean isMagicSquare() {
int num = rowSum(0);
boolean isEqual = false;
if(downDiagSum() == upDiagSum()){
//row check
for(int r = 0; r < grid.length; r++){
if(rowSum(r) == num){
isEqual = true;
}
}
//column check
for(int r = 0; r < grid.length; r++){
for(int c = grid.length - 1; c >= 0; c--){
if(colSum(c) == num){
isEqual = true;
}
}
}
}
return isEqual;}
代码大部分都有效,但如果我有一个系列,由于某种原因它总是 return 正确。下面设置的数字应该 return false 但 returns true
6 32 2 34 35 1
7 11 27 28 8 30
19 14 16 15 23 24
18 20 22 21 17 13
25 29 10 9 26 12
36 5 33 4 3 31
抱歉格式不正确,我对网站还是很陌生。
谢谢,
加罗斯
在你的两个循环中,你正在检查每一行和每一列。你的逻辑说当 one 行或 one 列总和等于第一行的总和(并且这个 includes 第一行的总和!!!),你的变量 isTrue
变为真(永远)!
所以,你应该反转你的逻辑...
伪算法:
isTrue = true
int magicSum = sumOfFirstDiagonal
if (magicSum != sumOfSecondDiagonal) {isTrue = false; return}
for each row
if (magicSum != sumOfRow) {isTrue = false; return}
for each column
if (magicSum != sumOfColumn) {isTrue = false; return}
下面是计算对角线和的正确方法:
public static int diagSumTwo() {
int sum = 0;
for (int r = 0; r < grid.length; r++) {
sum += grid[r][r];
}
return sum;
}
public static int diagSumOne() {
int sum = 0;
for (int r = grid.length - 1; r >= 0; r--) {
sum += grid[r][grid.length - 1 - r];
}
return sum;
}
问题出在 isMagicSquare
方法中。
假设 upDiagSum()
return 与 downDiagSum()
相同。然后您的代码进入 if
块并进入第一个 for
循环。但是在第一个 for
循环的第一次迭代中,您有 r = 0
,这意味着内部 if
语句等同于
if (rowSum(0) == rowSum(0))
这大概永远是真的。
因此 isEqual
在第一个循环的第一次迭代中设置为 true,并且您永远不会将其设置回 false。因此,无论后续迭代发生什么,您的方法的 return 值都将是 true
。
您需要更改逻辑,使 isEqual
最初为真,但当其中一个总和不匹配时变为假。
对于class,我们必须做一个幻方。我的代码有点工作,但它有多个正方形,最后一个总是 returns 0,这是幻方的工作原理。
这是我检查的方式
public int downDiagSum() {
int sum = 0;
for(int r = 0; r < grid.length; r++){
for(int c = 0; c < grid.length; c++){
sum += grid[r][c];
}
}
return sum;
public int upDiagSum() {
int sum = 0;
for(int r = grid.length - 1; r >= 0; r--){
for(int c = 0; c < grid.length; c++){
sum += grid[r][c];
}
}
return sum;
public int colSum(int col) {
int sum1 = 0;
for(int r = 0; r < grid[0].length; r++){
sum1 += grid[r][col];
}
return sum1;
public int rowSum(int row) {
int sum2 = 0;
for(int r = 0; r < grid[0].length; r++){
sum += grid[row][r];
}
return sum2;
public boolean isMagicSquare() {
int num = rowSum(0);
boolean isEqual = false;
if(downDiagSum() == upDiagSum()){
//row check
for(int r = 0; r < grid.length; r++){
if(rowSum(r) == num){
isEqual = true;
}
}
//column check
for(int r = 0; r < grid.length; r++){
for(int c = grid.length - 1; c >= 0; c--){
if(colSum(c) == num){
isEqual = true;
}
}
}
}
return isEqual;}
代码大部分都有效,但如果我有一个系列,由于某种原因它总是 return 正确。下面设置的数字应该 return false 但 returns true
6 32 2 34 35 1
7 11 27 28 8 30
19 14 16 15 23 24
18 20 22 21 17 13
25 29 10 9 26 12
36 5 33 4 3 31
抱歉格式不正确,我对网站还是很陌生。 谢谢, 加罗斯
在你的两个循环中,你正在检查每一行和每一列。你的逻辑说当 one 行或 one 列总和等于第一行的总和(并且这个 includes 第一行的总和!!!),你的变量 isTrue
变为真(永远)!
所以,你应该反转你的逻辑...
伪算法:
isTrue = true
int magicSum = sumOfFirstDiagonal
if (magicSum != sumOfSecondDiagonal) {isTrue = false; return}
for each row
if (magicSum != sumOfRow) {isTrue = false; return}
for each column
if (magicSum != sumOfColumn) {isTrue = false; return}
下面是计算对角线和的正确方法:
public static int diagSumTwo() {
int sum = 0;
for (int r = 0; r < grid.length; r++) {
sum += grid[r][r];
}
return sum;
}
public static int diagSumOne() {
int sum = 0;
for (int r = grid.length - 1; r >= 0; r--) {
sum += grid[r][grid.length - 1 - r];
}
return sum;
}
问题出在 isMagicSquare
方法中。
假设 upDiagSum()
return 与 downDiagSum()
相同。然后您的代码进入 if
块并进入第一个 for
循环。但是在第一个 for
循环的第一次迭代中,您有 r = 0
,这意味着内部 if
语句等同于
if (rowSum(0) == rowSum(0))
这大概永远是真的。
因此 isEqual
在第一个循环的第一次迭代中设置为 true,并且您永远不会将其设置回 false。因此,无论后续迭代发生什么,您的方法的 return 值都将是 true
。
您需要更改逻辑,使 isEqual
最初为真,但当其中一个总和不匹配时变为假。