先把横列每个乘积算出(不含零)
然后是纵列
最后计算即是 横列*纵列/当前数/当前数
含零时只有当前数为0其他不为零才计算
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int leni = in.nextInt();
int lenj = in.nextInt();
int[][] arr = new int[leni][lenj];
for (int i = 0; i < leni; i++) {
for (int j = 0; j < lenj; j++) {
arr[i][j] = in.nextInt();
}
}
int[][] proi = new int[leni][2];//横列乘积
int[][] proj = new int[lenj][2];//纵列乘积
for (int i = 0; i < leni; i++) {
int num1 = 1, num2 = 0;
for (int j = 0; j < lenj; j++) {
if (arr[i][j] != 0) {
num1 *= arr[i][j];//不为0则相乘
} else {
num2++;//为0计算0的个数
}
}
proi[i][0] = num1;
proi[i][1] = num2;
}
for (int i = 0; i < lenj; i++) {//纵列
int num1 = 1, num2 = 0;
for (int j = 0; j < leni; j++) {
if (arr[j][i] != 0) {
num1 *= arr[j][i];//不为0则相乘
} else {
num2++;//为0计算0的个数
}
}
proj[i][0] = num1;
proj[i][1] = num2;
}
int max = 0;
for (int i = 0; i < leni; i++) {
for (int j = 0; j < lenj; j++) {
if (proi[i][1] == 0 && proj[j][1] == 0){//没有0
max = Math.max(max, proi[i][0] * proj[j][0] / arr[i][j] / arr[i][j]);
}else if(proi[i][1] == 1 && arr[i][j] == 0 && proj[j][1] == 1){//有0且只有一个,这一个必须是当前数
max = Math.max(max, proi[i][0] * proj[j][0]);
}
}
}
System.out.println(max);
}
}
}



京公网安备 11010502036488号