[CPE一星49題] UVA10055 - Hashmat the Brave Warrior 題目解析與實作

編輯製作: 蔡豐聲、陳子晴

單位: 中國醫藥大學 醫療資訊學系 程式俱樂部

 YT: https://youtu.be/vaROAxQk8CI

## 題目資訊

  • 題目名稱: Hashmat the Brave Warrior
  • 編號: CPE10407, UVA10055

## 題目解析

小哈是一個勇敢的將領,他帶著年輕的士兵從一個城市移動到另一個城市與敵人對抗。在打仗之前,他會計算己方與敵方士兵的數目差距,來決定要不要開打。

注意: 題目雖然提到小哈的士兵數絕不會比敵人的士兵數大,但輸入資料可能會有反過來的狀況(即「大小」或「小大」)。

## 輸入說明

  • 每組測試資料佔一列,包含兩個整數,代表小哈與對手的士兵數。
  • 數值不會超過 $2^{32}$。
  • 輸入以 EOF (End of File) 結尾。

## 輸出說明

  • 輸出兩者數目的差值(正數)
  • 每個輸出結果需獨立佔一行。

## 範例測試

  • 輸入:

                  10 12  
                  14 10  

  •  輸出:

                  2  
                  4  

## 解題思路

  • 資料型態選擇:

  1. 由於數值可能達到 $2^{32}$,標準的 int 可能不足以存放(尤其在某些環境下 int 範圍為 $-2^{31} \sim 2^{31}-1$)。
  2. 建議選用 unsigned long long (64位元) 以確保運算安全。 
  • 處理連續輸入:
  1. 使用 while (scanf(...) != EOF) 或 Python 的 sys.stdin 迴圈來處理多組輸入直到檔案結束。
  • 計算絕對差距:
  1. 判斷兩數大小,始終以「大的減去小的」。
  2. 或者直接使用絕對值函數 abs() 

## 實作程式碼 (C語言)

#include <stdio.h>
#include <stdlib.h>

int main() {
    unsigned long long a = 0, b = 0;
    
    // 讀取直到 EOF
    while (scanf("%llu %llu", &a, &b) != EOF) {
        if (b >= a) {
            printf("%llu\n", b - a);
        } else {
            printf("%llu\n", a - b);
        }
    }
    return 0;
}   
---
本著作採用創用 CC 姓名標示-非商業性-禁止改作 3.0 台灣 授權條款授權。
本部落格的免責聲明
程式俱樂部YT頻道 https://www.youtube.com/@tsai-cai