本說明文件僅供參考,
比賽時以

比賽主機

上之資訊為準。

The 2022 NTU NPSC

「比賽時間內」泛指:

模擬測試,比賽活動期間內。

比賽快結束了!
Kattis文件
還沒開始。
比賽 將會開始於 -4 days 23:43:27

經過時間

5:00:00

剩餘時間

0:00:00

解決更複雜的題目

這個頁面敘述要如何解決比在 前一篇教學 中 "Hello World!" 更困難的問題。

  1. 閱讀題目
  2. 讀取輸入
  3. 計算答案
  4. 解答

A Different Problem目前無法上傳


第一步: 閱讀題目

我們要解的問題是 A Different Problem 這個問題是請你計算兩個不同整數之間的差值, 聽起來很簡單對吧? 不過如果進一步來看,這個問題還是有些小小的難點。


第二步: 讀取輸入

要注意輸入的整數可能很大,最大會到 263-1, 這會超過 int (最大到 231-1)的上限。 幸運的是我們可以在 C/C++ 或是 Java 中使用64 bit的整數, C/C++ 叫做long long,在Java中叫做long

現在我們已經決定了適合的變數型態, 只剩下要將輸入讀到變數中, 輸入會使用標準的輸入, 在這題裡面我們需要持續讀入到遇到 end of the file (EOF) 時停止 (有些問題一開始有可能會先給個整數代表輸入的數量, 告訴你有多少輸入要讀,或是有特殊的規定告訴你要不要繼續讀下去), 在 C/C++ 中我們可以使用scanf來處理輸入:

long long a, b;
while (scanf("%lld%lld", &a, &b) == 2) {
   // solve test case and output answer
}

在 C++ 中我們可以使用 cin 來處理輸入:

long long a, b;
while (cin >> a >> b) {
   // solve test case and output answer
}

在Java中我們可以使用 Scanner (需要從 java.util import) 來處理輸入:

Scanner sc = new Scanner(System.in);
while (sc.hasNextLong()) {
   long a = sc.nextLong(), b = sc.nextLong();
   // solve test case and output answer
}

第三步: 計算答案

讀完了輸入之後,接著要來真的解決問題。 因為 0 ≤ a, b ≤ 263-1, 所以我們知道 -(263-1) ≤ a-b ≤ 263-1, 這表示直接使用64 bit整數做運算並不會溢位, 因此我們直接將ab相減, 然後將算完的結果取絕對值就可以得到答案, 絕對值函式可以用「遇到負數就取負號」簡單做到, 或是可以使用內建的 function (像是 Java 中的 Math.abs)。

最後我們需要將結果輸出, 在 C/C++ 中我們可以使用 printf 輸出 (假設我們用 long long 變數 r 存了答案):

printf("%lld\n", r);

在C/C++中我們可以使用cout:

cout << r << endl;

在Java中我們可以這樣做 (假設我們用long變數r存了答案):

System.out.println(r);

第四步: 解答

基本上我們完成了題目,以下的code 整合了上述的所有步驟。

這裡有四種不同版本的完整解答 (一種語言一個,C++附上兩種不同格式的輸入輸出版本)。

different.c Solution in C
different_stdio.cc Solution in C++ (using scanf/printf)
different.cc Solution in C++ (using cin/cout)
Different.java Solution in Java