26 lines
736 B
Text
26 lines
736 B
Text
fn egyptian_divide(dividend: u32, divisor: u32) -> (u32, u32) {
|
|
let dividend = dividend as u64;
|
|
let divisor = divisor as u64;
|
|
|
|
let pows = (0..32).map(|p| 1 << p);
|
|
let doublings = (0..32).map(|p| divisor << p);
|
|
|
|
let (answer, sum) = doublings
|
|
.zip(pows)
|
|
.rev()
|
|
.skip_while(|(i, _)| i > ÷nd )
|
|
.fold((0, 0), |(answer, sum), (double, power)| {
|
|
if sum + double < dividend {
|
|
(answer + power, sum + double)
|
|
} else {
|
|
(answer, sum)
|
|
}
|
|
});
|
|
|
|
(answer as u32, (dividend - sum) as u32)
|
|
}
|
|
|
|
fn main() {
|
|
let (div, rem) = egyptian_divide(580, 34);
|
|
println!("580 divided by 34 is {} remainder {}", div, rem);
|
|
}
|