สมมติว่าเรามีตัวหารและตัวหารจำนวนเต็มสองตัว เราต้องหารจำนวนเต็มสองจำนวนโดยไม่ใช้ตัวดำเนินการการคูณ การหาร และตัวดัดแปลง คืนผลหารหลังจากหารเงินปันผลด้วยตัวหาร การหารจำนวนเต็มควรตัดให้เหลือศูนย์ อินพุตทั้งสองเป็นจำนวนเต็ม
ดังนั้นหากอินพุตที่กำหนดเป็นเงินปันผล =7 ตัวหาร =-3 ผลลัพธ์จะเป็น -2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ใช้สองอาร์กิวเมนต์ x และ y แสดงว่า x หาร y
- ถ้า x <-Infinity และ y =1 แล้วคืนค่าอนันต์
- a :=|x|, b :=|y| และคำตอบ :=0
- ในขณะที่ a – b>=0
- p :=0
- ในขณะที่ a – (เลื่อนซ้าย b (เลื่อนซ้าย 1 p ครั้ง))>=0
- p :=p + 1
- a :=a – (เลื่อนซ้าย b, p ครั้ง)
- ans :=ans + เลื่อนซ้าย 1 p ครั้ง
- ถ้า x> 0 เป็นจริงและ y> 0 เป็นจริงด้วย ให้คืนค่า ans ไม่เช่นนั้นให้คืนค่า (– ans)
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น −
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int divide(int l, int y) { if(l <= INT_MIN && y == -1)return INT_MAX; lli a = labs(l); lli b = labs(y); lli ans = 0; while(a-b >= 0){ int x = 0; while(a-(b << 1 << x) >= 0){ x++; } a -= b<<x; ans += 1<<x; } return (l>0)== (y>0)?ans:-ans; } }; main(){ Solution ob; cout << ob.divide(40, 3); }
อินพุต
40 3
ผลลัพธ์
13