-
Notifications
You must be signed in to change notification settings - Fork 89
Expand file tree
/
Copy path29-divide-two-integers.py
More file actions
70 lines (52 loc) · 2.62 KB
/
29-divide-two-integers.py
File metadata and controls
70 lines (52 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
# Handle edge cases for overflow
if dividend == -2**31 and divisor == -1:
return 2**31 - 1
# Determine the sign of the result
negative = (dividend < 0) != (divisor < 0)
# Convert to positive long to handle absolute values of -2**31 without overflow
ldividend = abs(dividend)
ldivisor = abs(divisor)
quotient = 0
# Repeatedly subtract divisor from dividend
while ldividend >= ldivisor:
temp_divisor = ldivisor
multiple = 1
# Find the largest multiple of divisor that is less than or equal to dividend
while ldividend >= (temp_divisor << 1):
temp_divisor <<= 1
multiple <<= 1
ldividend -= temp_divisor
quotient += multiple
# Apply the sign
if negative:
return -quotient
else:
return quotient
# Test cases
if __name__ == "__main__":
sol = Solution()
print("Testing Divide Two Integers:\n")
# Test 1
print(f"Input: dividend = 10, divisor = 3 -> Output: {sol.divide(10, 3)} (Expected: 3)")
# Test 2
print(f"Input: dividend = 7, divisor = -3 -> Output: {sol.divide(7, -3)} (Expected: -2)")
# Test 3
print(f"Input: dividend = 0, divisor = 1 -> Output: {sol.divide(0, 1)} (Expected: 0)")
# Test 4: Edge case - dividend is -2**31, divisor is -1
print(f"Input: dividend = -2**31, divisor = -1 -> Output: {sol.divide(-2**31, -1)} (Expected: {2**31 - 1})")
# Test 5: Edge case - dividend is -2**31, divisor is 1
print(f"Input: dividend = -2**31, divisor = 1 -> Output: {sol.divide(-2**31, 1)} (Expected: {-2**31})")
# Test 6: Standard positive division
print(f"Input: dividend = 100, divisor = 5 -> Output: {sol.divide(100, 5)} (Expected: 20)")
# Test 7: Negative dividend, positive divisor
print(f"Input: dividend = -29, divisor = 3 -> Output: {sol.divide(-29, 3)} (Expected: -9)")
# Test 8: Positive dividend, negative divisor
print(f"Input: dividend = 29, divisor = -3 -> Output: {sol.divide(29, -3)} (Expected: -9)")
# Test 9: Both negative
print(f"Input: dividend = -29, divisor = -3 -> Output: {sol.divide(-29, -3)} (Expected: 9)")
# Test 10: Divisor larger than dividend (positive)
print(f"Input: dividend = 3, divisor = 10 -> Output: {sol.divide(3, 10)} (Expected: 0)")
# Test 11: Divisor larger than dividend (negative)
print(f"Input: dividend = -3, divisor = 10 -> Output: {sol.divide(-3, 10)} (Expected: 0)")