先把横列每个乘积算出(不含零)
然后是纵列
最后计算即是 横列*纵列/当前数/当前数
含零时只有当前数为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); } } }