solved 23

This commit is contained in:
Fabian Schmidt 2024-09-16 12:42:55 +02:00
parent 0caf96d6db
commit 700e48d6c2
2 changed files with 68 additions and 0 deletions

View File

@ -25,5 +25,9 @@ fn get_divisors(n: usize) -> Vec<usize> {
} }
potential_divisor = potential_divisor + 1; potential_divisor = potential_divisor + 1;
} }
// This almost made me go mad
if potential_divisor * potential_divisor == n {
divisors.push(potential_divisor)
}
divisors divisors
} }

64
src/bin/problem_23.rs Normal file
View File

@ -0,0 +1,64 @@
use std::cmp::Ordering;
use crate::NumberType::{Abundant, Deficient, Perfect};
// 4179871
fn main() {
let mut abundants = vec![];
let mut sum = 0;
let upper_bound = 28123;
for num in 1..=upper_bound {
let num_type = get_number_type(num);
if num_type == Abundant {
abundants.push(num);
}
let mut contained = false;
for abundant in &abundants {
match abundants.binary_search(&(num-abundant)) {
Ok(_) => {
contained = true;
break;
}
Err(_) => {}
}
}
if !contained {
sum += num;
}
}
//println!("{:?}", abundants);
println!("{sum}");
}
#[derive(Eq, PartialEq)]
enum NumberType {
Perfect,
Deficient,
Abundant,
}
fn get_number_type(n: usize) -> NumberType {
let divisor_sum = get_divisors(n).iter().sum::<usize>();
match divisor_sum.cmp(&n) {
Ordering::Equal => Perfect,
Ordering::Less => Deficient,
Ordering::Greater => Abundant,
}
}
fn get_divisors(n: usize) -> Vec<usize> {
let mut divisors = vec![1];
let mut potential_divisor = 2;
while (potential_divisor * potential_divisor) < n {
if n % potential_divisor == 0 {
divisors.push(potential_divisor);
divisors.push(n / potential_divisor);
}
potential_divisor = potential_divisor + 1;
}
// This almost made me go mad, should have used the one from 21
if potential_divisor * potential_divisor == n {
divisors.push(potential_divisor)
}
divisors
}