首先把問題先想成兩個部分 : 要怎麼知道在沒有 if 和大於小於運算子來知道 、 哪個比較大,以及要怎麼用前面的結果來回傳答案。
後面那個部分比較簡單,假設經過一輪運算後可以得到一個值 ,的時候代表 ,而 的時候則 。那我們可以把答案表示成 ,而接著我們要想辦法算出 ,計算 的方法其實有很多種,下面介紹其中的三種方法。
題目的減法操作所造成的 overflow,會讓 的這個 bit 值改變。在比大小的時候,首先如果 在 這個的 bit 如果不同,因為它是最大的位數,所以就已經可以判斷出 的大小;如果 在 這個的 bit 相同,在 這個的 bit 相減的話會被消除 (都是 的話會互消, 的話就沒這問題),所以結論是變成兩個 的數相減,如果減出來變負的,就會因為 overflow 讓 這個的 bit 變成 ,反之這個 bit 為 ,我們可以用上述的方法算出我們要的 。(本作法由 korinoba 提供)
概念和前面一樣,只是故意讓「、」都變成 ,就是在一開始的時候直接將 都先除以 ,如果相同再根據最低的 bit 的情況回傳答案。
前面用到的是減法的特性,而答案也可以用除法計算,可以先令一個函數
則 實際上可以用 來表示,其中,還必須特別避免 與 的情況。在 且 或 且 時,可以直接把 的數字 (這裡用到了 , 的做法也是如此),可以發現這樣做不會影響答案的值。否則若 且 時 ,同樣可以把 都 ,但要記得對最後的答案做特殊處理(記得 )。
(本做法由 Ststone 提供)
上面的三種都可以在適當的實作下完成題目要求的目標。