iT邦幫忙

2021 iThome 鐵人賽

DAY 1
1
自我挑戰組

用 C & C++ 帶你手把手解 UVa 一顆星選集系列 第 1

Day 0x1 Intro & UVa10055 Hashmat the Brave Warrior

Intro

  • UVa 一顆星選集
    UVa Online Judge (wiki) 為線上自動評斷系統,擁有豐富的題目庫,而一顆星選集為 CPE 所進行之分級及選題,根據規則所述,自 2013 / 5 / 28 起,每次必包含其中一題!因此為了拿初級證書一定要會呦XDD
  • C & C++
    如同簡介所述,解題時發現資源多為 C++ 語法 (雖然可能更快更短),且用到許多 STL 寫法,是 C 語言不容易實現的寫法,因此想和大家分享這些醜 Code C 的美妙!

    也可能是我不會搜尋,純粹沒找到
    還有寫得不好歡迎討論,大神鞭小力點 QQ

  • 解題環境
    繳交平台個人是用 Virtual JudgeZeroJudge (有中文ㄎㄎ) 居多,只要能看到題目 & 繳交評測就 OK;而程式撰寫則是使用 Visual Studio Code,也是選擇自己習慣的 Coding 環境就行囉~

UVa10055 Hashmat the Brave Warrior

  • Virtual Judge
  • ZeroJudge
  • 題意
    沒啥重點,簡單來說就是輸入兩個數字,輸出兩者差即可,需要注意的有以下幾點:
    1. 每行輸入為兩整數
    2. 輸入之數字皆 https://chart.googleapis.com/chart?cht=tx&chl=%24%5Cleq%5C%202%5E%7B32%7D%24
    3. 輸入用 EOF 結束
    4. 輸出要換行
  • 解法
    • 一般情況下 int 最大可表 https://chart.googleapis.com/chart?cht=tx&chl=%242%5E%7B31%7D%20-%201%20%5Clt%5C%202%5E%7B32%7D%24
      • long long int%lld 取代
    • 迴圈的 EOF 寫法就長那樣,應該沒問題...吧?
    • 因為題目沒有規定輸入的兩數之大小關係,因此取差時需先用 ifswap,最後用大減小即可
      • 若熟悉語法的可能會想用 abs 函數來取絕對值即可,但交上去會發現得到 WA,若去查 Reference 即可發現此函數的 ParameterReturn Value 皆為 int,因此在此題會發生 Overflow
      • 但但但但但超凡脫俗的 C++ 有 template 這個神奇的東東,所以再去看 abs 的 Reference (選 C++11),可以發現有支援 long long int
  • C Code
    #include<stdio.h>
    
    int main(){
    
        long long Hashmat, opponent;
        long long temp;
    
        while(scanf("%lld %lld", &Hashmat, &opponent) != EOF){
            if(Hashmat >  opponent){
                temp = Hashmat;
                Hashmat =  opponent;
                opponent = temp;
            }
            temp = opponent - Hashmat;
            printf("%lld\n",  temp);
        }
    
        return 0;
    }
    

下一篇
Day 0x2 UVa11150 Cola
系列文
用 C & C++ 帶你手把手解 UVa 一顆星選集30

尚未有邦友留言

立即登入留言