什麼是取餘運算

求除法餘數的運算,在虛擬碼中寫成 mod,在許多語言中寫成 %。x mod 10 可得到個位數,x mod 2 可判斷偶數或奇數,i mod n + 1 可得到在1〜n之間循環的編號。負數餘數的符號因語言而異。

日文名稱: 剰余演算

「取餘運算」出現在3領域的8道練習題中(程式設計基礎(虛擬碼追蹤), 資料結構與演算法, 記憶體階層與效能等)。

這個名詞所屬的領域: 程式設計基礎(虛擬碼追蹤)

練習取餘運算的題目

在大小為7(位置0~6)的雜湊表中,以雜湊函數 h(k) = k mod 7 依序存放鍵10、17、24、3。發生碰撞時,使用把位置逐一往後移(6的下一個是0)來尋找空位置的線性探測法。鍵3會存放在哪個位置?

  1. A位置3
  2. B位置4
  3. C位置6
查看答案與解析

正確答案:C. 位置6

4個鍵除以7的餘數都是3,因此都會先檢查位置3。10放入位置3;17因位置3已被占用而放入位置4;24因位置3、4已被占用而放入位置5。3因位置3、4、5都已被占用,所以存放在位置6。如此可見,線性探測法會使被占用的位置聚集在一起(叢集),越晚來的鍵需要檢查的次數越多。

函數 f(x, y) 定義為「若 y 為0則回傳 x,否則回傳 f(y, x mod y)」。呼叫 f(84, 36) 時的回傳值,以及 f 被呼叫的次數(含第一次呼叫)的組合為下列何者?

  1. A回傳值12,呼叫3次
  2. B回傳值12,呼叫4次
  3. C回傳值6,呼叫3次
查看答案與解析

正確答案:A. 回傳值12,呼叫3次

f(84, 36) 因 84 mod 36 = 12 而呼叫 f(36, 12),又因 36 mod 12 = 0 而呼叫 f(12, 0),由於 y 為0,回傳12。呼叫為 f(84, 36)、f(36, 12)、f(12, 0) 共3次,這就是以輾轉相除法(歐幾里得演算法)求最大公因數的計算。此函數直接回傳遞迴呼叫結果,屬於尾端遞迴,若編譯器進行尾端呼叫最佳化就能轉換成迴圈,即使呼叫很深也不會持續消耗堆疊。

解析中的「取餘運算」

出現「取餘運算」的題目(8題)

  1. 在大小為7(位置0~6)的雜湊表中,以雜湊函數 h(k) = k mod 7 依序存放鍵10、17、24、3。發生碰撞時,使用把位置逐一往後移(6的下一個是0)來尋找空位置的線性探測法。鍵3會存放在哪個位置?
  2. 函數 f(x, y) 定義為「若 y 為0則回傳 x,否則回傳 f(y, x mod y)」。呼叫 f(84, 36) 時的回傳值,以及 f 被呼叫的次數(含第一次呼叫)的組合為下列何者?
  3. 有一個把元素數為4的字串型陣列 q 環狀使用的佇列。head 與 tail 的初值為1,enq(v) 執行 q[tail] ← v 後再執行 tail ← tail mod 4 + 1,deq() 回傳 q[head] 的值後執行 head ← head mod 4 + 1。執行下列程式時,「E」會存放在 q 的哪個元素?
  4. 在快取行大小64位元組、組數64的快取中,位址0x1234的資料所放入的組編號為下列何者?
  5. ÷ 為除法,代入整數型變數(含引數)時捨去小數部分。以 f(9087) 呼叫下列函式 f 時,回傳值為下列何者?
  6. ÷ 為除法,代入整數型變數(含引數)時捨去小數部分。以 toBin(12) 呼叫下列函式 toBin 時,回傳值為下列何者?
  7. 下列程式以減法使兩個整數 a、b 逐漸相等。執行後 k 的值為下列何者?
  8. 下列函式 isLeap 在西元 y 年為閏年時回傳 true。and 比 or 先計算。isLeap(y) 回傳 true 的 y 為下列何者?

相關名詞

回傳值 變數 引數 雜湊表 雜湊函數 遞迴 堆疊 陣列 佇列 快取行

前往名詞解釋列表