【问题标题】:Java not displaying the last outputJava不显示最后的输出
【发布时间】:2021-07-06 00:29:01
【问题描述】:

我正在解决 codeforces 上的一个问题,并且出现运行时错误,显然除非我按 enter 键,否则不会显示最后的输出。

代码如下:

package com.company;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int tests;
        tests = sc.nextInt();
        for (int i = 0; i < tests; i++) {
            long n, m, number, result;
            n = sc.nextLong();
            m = sc.nextLong();
            number = sc.nextLong();
            if (number % n == 0) {
                result = (n - 1) * m + (number / n);
            } else {
                result = (((number % n) - 1) * m) + (number / n) + 1;
            }
            System.out.println(result);
        }
    }
}

这是一个非常简单的问题,我认为我的答案是正确的,但是我在显示输出时遇到了问题 这是问题的链接: https://codeforces.com/contest/1506/problem/A

当我尝试以下输入时:

5
1 1 1
2 2 3
3 5 11
100 100 7312
1000000 1000000 1000000000000

我得到了正确的输出,但是像这样:

1
2
9
1174

最后一个输出只在我按回车时显示,然后显示 1000000000000。 我相信我从 codeforces 收到的运行时错误是因为正在纠正问题的机器人正在无休止地等待输入键。

我做错了什么,我该如何解决? 我通常使用 C 语言和 codeforces,这是我第一次使用 java,如有明显错误,请见谅。

感谢您的宝贵时间。

【问题讨论】:

  • 不确定您的问题。您的程序正常运行。请准确地描述你在做什么。
  • 另外...在 CLI 上输入内容后,您始终必须按 Enter 按钮。否则扫描器不知道下一个令牌
  • 对我也很好。看着代码,我认为这是真的。我认为问题是特定于 codeforces 的。如果这是真的,我不知道我们能如何帮助你。至少,我对那种环境一点也不熟悉。代码是对的。问题出在其他地方。
  • 对不起,我编辑了问题,您需要按照问题中显示的方式输入输入,而不是全部在一行。
  • 好吧,如果每行末尾都有一个 newline 字符,那么扫描仪就会有一些标记。然后,您必须在最后一行之后按 Enter 按钮。或者,您也可以复制另一个换行符并粘贴。

标签: java output enter


【解决方案1】:

我很确定问题在于您粘贴的数据包含换行符,但末尾不包含换行符。通过这样做,我能够重现该问题或类似问题。当我在粘贴内容的末尾添加换行符时,代码会按照您希望的方式运行。

如果粘贴末尾没有换行符,扫描仪不会立即看到最后一个数字。原因是最后一个字符是数字,因此扫描仪无法知道您是否要输入更多数字。您必须输入一个非数字字符才能继续并完成操作。它不必是换行符,只是一些空白字符(如空格)。

【讨论】:

  • 我刚刚尝试了你说的,但是很抱歉没有奏效,可能是我误解了你,你能告诉我你在代码中编辑了什么吗?
  • 嗨@KamelYehya - 你有没有想过这个?我想我错过了看到你的评论。我不是在谈论对代码的任何更改,而是在谈论您输入数据的方式。如果我还能澄清,请告诉我。
【解决方案2】:

您可以按照 codeforces 中的说明输入输入,但您必须将输出保存在某个位置并在最后打印结果:

Scanner sc = new Scanner(System.in);
int tests;
tests = sc.nextInt();
List<Long> outputList=new ArrayList<Long>();
for (int i = 0; i < tests; i++) {
    long n, m, number, result;
    n = sc.nextLong();
    m = sc.nextLong();
    number = sc.nextLong();
    if (number % n == 0)
        result = (n - 1) * m + (number / n);
    else
        result = (((number % n) - 1) * m) + (number / n) + 1;
    outputList.add(result);
}
for(Long x : outputList)
    System.out.println(x);

【讨论】:

  • 我尝试了您的解决方案,但它仍然是运行时错误,因为编译器出于某种原因正在等待输入键
  • 是的,你必须在最后按下回车键(当你粘贴你的输入时)。你想如何输入你的数据? 5+enter+1+1+1+enter或者粘贴整个输入然后按enter键?
  • 根据codeforces,一旦输入输入,输出就必须显示,没有回车键。
【解决方案3】:

虽然解决方案可能更类似于 Java,也更简单

long n = sc.nextLong();
long m = sc.nextLong();
long number = sc.nextLong() - 1;
System.out.println(1 + number / n + (number % n) * m);

(事实上,自 C99 以来,C 也允许动态声明变量,所以 20 多年)
您面临的问题似乎与 Codeforces 有关。

使用标准输入时,您可以编辑键入的内容,只需尝试使用箭头移动并删除/添加字符。当你按下 Enter 时会发生实际输入,这就是你必须按下它的原因。到目前为止,您处于操作系统的行编辑器中(就像在命令提示符中一样)或 IDE 放在您面前的东西,而 Java 代码绝对无法对此做任何事情。即使你想从System.in读取一个字节,直到用户按下Enter你才能得到它,你可以用一行代码测试它,System.out.println(System.in.read());

【讨论】:

    【解决方案4】:

    问题出在包名上。 在像 codeforces 这样的编码程序中,你不应该添加包名,否则会导致运行时错误。 关于回车键,这不是问题。 正如你们中的一些人指出的那样,您应该始终按回车键,否则扫描仪将不知道下一个令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2022-12-03
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      相关资源
      最近更新 更多