speed up proper divisor algorithm (95)
This commit is contained in:
+28
-4
@@ -23,6 +23,10 @@ fn main() {
|
|||||||
println!("{smallest}");
|
println!("{smallest}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn build_proper_divisors(max: usize) -> Vec<Vec<usize>> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
fn try_build_chain_from_number(
|
fn try_build_chain_from_number(
|
||||||
max: usize,
|
max: usize,
|
||||||
mut current: usize,
|
mut current: usize,
|
||||||
@@ -34,7 +38,7 @@ fn try_build_chain_from_number(
|
|||||||
loop {
|
loop {
|
||||||
maybe_chain.push(current);
|
maybe_chain.push(current);
|
||||||
|
|
||||||
let next: usize = get_proper_divisors(current).sum();
|
let next: usize = get_proper_divisors(current).into_iter().sum();
|
||||||
|
|
||||||
if next > max || next == 0 {
|
if next > max || next == 0 {
|
||||||
break;
|
break;
|
||||||
@@ -55,9 +59,29 @@ fn try_build_chain_from_number(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_proper_divisors(x: usize) -> impl Iterator<Item = usize> {
|
fn get_proper_divisors(x: usize) -> Vec<usize> {
|
||||||
|
let mut result = vec![1];
|
||||||
|
|
||||||
let limit = x / 2 + 1;
|
let limit = x / 2 + 1;
|
||||||
(1..limit).filter(move |i| x % *i == 0)
|
|
||||||
|
for i in 2..limit {
|
||||||
|
if result.contains(&i) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if x % i == 0 {
|
||||||
|
let div_1 = i;
|
||||||
|
let div_2 = x / i;
|
||||||
|
result.push(div_1);
|
||||||
|
|
||||||
|
if div_2 != div_1 {
|
||||||
|
result.push(div_2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.sort_unstable();
|
||||||
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -72,7 +96,7 @@ mod tests {
|
|||||||
fn proper_divisor(#[case] input: usize, #[case] expected: Vec<usize>) {
|
fn proper_divisor(#[case] input: usize, #[case] expected: Vec<usize>) {
|
||||||
use crate::get_proper_divisors;
|
use crate::get_proper_divisors;
|
||||||
|
|
||||||
assert_eq!(get_proper_divisors(input).collect::<Vec<_>>(), expected);
|
assert_eq!(get_proper_divisors(input), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[rstest]
|
#[rstest]
|
||||||
|
|||||||
Reference in New Issue
Block a user