From a296a13e73842815d27e5c66d7915e44aee945bc Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Wed, 20 Aug 2025 00:01:04 +0800 Subject: [PATCH] feat: 29_divide_two_integer --- 29_divide_two_integer/Cargo.lock | 7 ++++ 29_divide_two_integer/Cargo.toml | 6 ++++ 29_divide_two_integer/src/lib.rs | 58 ++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 29_divide_two_integer/Cargo.lock create mode 100644 29_divide_two_integer/Cargo.toml create mode 100644 29_divide_two_integer/src/lib.rs diff --git a/29_divide_two_integer/Cargo.lock b/29_divide_two_integer/Cargo.lock new file mode 100644 index 0000000..1968a90 --- /dev/null +++ b/29_divide_two_integer/Cargo.lock @@ -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" diff --git a/29_divide_two_integer/Cargo.toml b/29_divide_two_integer/Cargo.toml new file mode 100644 index 0000000..803d5f2 --- /dev/null +++ b/29_divide_two_integer/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "divide_two_integer" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/29_divide_two_integer/src/lib.rs b/29_divide_two_integer/src/lib.rs new file mode 100644 index 0000000..eaaa4bc --- /dev/null +++ b/29_divide_two_integer/src/lib.rs @@ -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 } + } + } +}