feat: 29_divide_two_integer

This commit is contained in:
SquidSpirit 2025-08-20 00:01:04 +08:00
parent cb2281d912
commit a296a13e73
3 changed files with 71 additions and 0 deletions

7
29_divide_two_integer/Cargo.lock generated Normal file
View File

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "divide_two_integer"
version = "0.1.0"

View File

@ -0,0 +1,6 @@
[package]
name = "divide_two_integer"
version = "0.1.0"
edition = "2024"
[dependencies]

View File

@ -0,0 +1,58 @@
pub struct Solution;
impl Solution {
/// - Dividend = Quotient * Divisor + Rem
/// - Rem < Divisor
pub fn divide(mut dividend: i32, mut divisor: i32) -> i32 {
if divisor == i32::MIN {
return if dividend == i32::MIN { 1 } else { 0 };
}
let is_positive = dividend.is_positive() == divisor.is_positive();
let mut is_overflow = false;
if dividend == i32::MIN {
is_overflow = true;
dividend += 1;
}
dividend = dividend.abs();
divisor = divisor.abs();
if dividend < divisor {
return 0;
}
let mut quotient = 0;
let mut rem;
loop {
let mut exp = 1;
while divisor << exp <= dividend && divisor << exp > 0 {
exp += 1;
}
exp -= 1;
quotient += 1 << exp;
rem = dividend - (divisor << exp);
if rem < divisor {
break;
}
dividend = rem;
}
if is_overflow && rem + 1 >= divisor {
if is_positive {
if quotient == i32::MAX {
quotient
} else {
quotient + 1
}
} else {
-quotient - 1
}
} else {
if is_positive { quotient } else { -quotient }
}
}
}