【问题标题】:2D Array: Magic Square二维阵列:魔方
【发布时间】:2017-11-13 02:43:12
【问题描述】:

我正在研究的问题是:

如果每行、每列和两条对角线的元素之和相同,则边长为 n 的正方形用数字填充1,2,3,...n2 是一个幻方。

编写一个程序,从键盘读取 16 个值,并测试它们在放入 4 x 4 数组时是否形成魔方。您需要测试以下 2 个功能:

  • 1,2,...16 的每个数字是否都出现在用户输入中?如果用户输入了他们已经输入的数字,请告诉他们再试一次。
  • 将数字放入正方形时,行、列和对角线之和是否相等?
  • 必须使用二维数组来完成

如果用户输入了之前输入的数字,我无法要求他们重试。而且,4 x 4 中的数字不打印。 我究竟做错了什么?我该如何解决?

这是我目前的代码:

 Scanner in = new Scanner (System.in);

    int n =4;

    int[][] square = new int[n][n];

    int number = 0;
    int num = 0;

    for (int i = 0; i <16; i++){
      number = num;
      System.out.print ("Enter a number: ");
      num = in.nextInt();

      int num_2 = 0;

      if (number==num || number==num_2) {
        System.out.println ("Try again.");
        System.out.println ("Enter a number: ");
        num_2 = in.nextInt();
      }
      if (num > 16){
        System.out.println ("Try again.");
        break;
      }
    }

    for (int i= 0; i < n; i++){
      for (int j = 0; j < n; j++) {
        num+=square [i][j];
        System.out.print(square[i][j] + "\t");
      }
    }
  }
}

【问题讨论】:

  • 请帮助我了解您在第一个功能中想要什么。我认为应该是从 1 到 16 的错字。我说的对吗?
  • 你是对的。对不起,从 1 到 16。

标签: java arrays 2d


【解决方案1】:

您可以尝试此代码用于第一个功能并添加代码用于第二个。

int ar[][] = new int[4][4];
    System.out.println("Enter Numbers");
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            boolean flag = false;
            int num = sc.nextInt();
            if (num > 16 || num < 1) {
                System.out.println("Please Enter number between 1 to 16");
                flag=true;
                j--;

            } else {
                for (int k = 0; k <= i; k++) {
                    for (int l = 0; l <= j; l++) {
                        if (ar[k][l] == num) {
                            System.out.println("This number already inserted...Please give another");
                            j--;
                            flag = true;
                        }

                    }
                }
            }
            if (!flag) {
                ar[i][j] = num;
            }
        }
    }

如果有什么不懂的请追问。 希望对您有所帮助。

【讨论】:

  • 感谢您分享您的答案。我理解你的代码,但这并不是问题所要问的。程序应该告诉用户他们输入了一个他们之前已经输入过的数字,因为他们正在输入数字。在您的代码中,这是在之后编写的,并且不会打印。我不确定我是否没有完全理解您的代码,或者它是否有问题。你能澄清一下吗?谢谢
  • @Kelsey 代码正确,else 部分下的代码检查用户是否已经输入了号码。假设如果用户输入 9,然后再次输入 9,代码将打印 “此号码已插入...请提供另一个”。而且我正在检查数字是否在 1 到 16 之间,因此在输入 1 到 16 之间的所有数字之前,代码会要求它。希望你能理解。尝试在您的系统上运行此代码并使用不同的数字来检查其有效性。
  • 我并不是说代码不正确。代码是正确的并且运行没有任何错误。但是,当用户输入相同的号码两次时,它不会打印“此号码已插入...请提供另一个”。我已经尝试过多次。问题是要求用户输入另一个数字,如果他们输入了两次相同的数字。希望你能帮忙。
  • @Kelsey 对不起,我的错误......只需在此声明后添加flag=true; System.out.println("Please Enter number between 1 to 16"); 并将boolean flag = true; 更改为boolean flag = false;
  • @Kelsey 我已经对上面的代码进行了修改,尝试再次运行。
猜你喜欢
  • 1970-01-01
  • 2015-01-30
  • 2021-06-14
  • 1970-01-01
  • 2011-01-03
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多