feat: add initial implementation of Cargo.toml, Cargo.lock, and lib.rs for divide_two_integer function
This commit is contained in:
parent
d3694c009a
commit
3be9a07d85
7
29_divide_two_integer/Cargo.lock
generated
Normal file
7
29_divide_two_integer/Cargo.lock
generated
Normal 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"
|
6
29_divide_two_integer/Cargo.toml
Normal file
6
29_divide_two_integer/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "divide_two_integer"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
58
29_divide_two_integer/src/lib.rs
Normal file
58
29_divide_two_integer/src/lib.rs
Normal 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 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user