feat(21): complete amicable numbers
This commit is contained in:
parent
68e02a020b
commit
6ab9e999b5
3 changed files with 48 additions and 1 deletions
|
@ -39,7 +39,7 @@ Here is a [link to my profile](https://projecteuler.net/progress=newtykins).
|
||||||
- [x] 18 - [Maximum path sum I](src/bin/18.rs)
|
- [x] 18 - [Maximum path sum I](src/bin/18.rs)
|
||||||
- [x] 19 - Counting Sundays
|
- [x] 19 - Counting Sundays
|
||||||
- [x] 20 - Factorial digit sum
|
- [x] 20 - Factorial digit sum
|
||||||
- [ ] 21 - Amicable numbers
|
- [x] 21 - Amicable numbers
|
||||||
- [x] 22 - [Names scores](src/bin/22.rs)
|
- [x] 22 - [Names scores](src/bin/22.rs)
|
||||||
- [ ] 23 - Non-abundant sums
|
- [ ] 23 - Non-abundant sums
|
||||||
- [ ] 24 - Lexicographic permutations
|
- [ ] 24 - Lexicographic permutations
|
||||||
|
|
44
src/bin/21.rs
Normal file
44
src/bin/21.rs
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
Problem 21 - Amicable Numbers
|
||||||
|
|
||||||
|
Let $d(n)$ be defined as the sum of proper divisors of $n$ (numbers less than $n$ which divide evenly into $n$).
|
||||||
|
If $d(a) = b$ and $d(b) = a$, where $a \ne b$, then $a$ and $b$ are an amicable pair and each of $a$ and $b$ are called amicable numbers.
|
||||||
|
For example, the proper divisors of $220$ are $1, 2, 4, 5, 10, 11, 20, 22, 44, 55$ and $110$; therefore $d(220) = 284$. The proper divisors of $284$ are $1, 2, 4, 71$ and $142$; so $d(284) = 220$.
|
||||||
|
Evaluate the sum of all the amicable numbers under $10000$.
|
||||||
|
*/
|
||||||
|
|
||||||
|
fn proper_divisors(number: usize) -> Vec<usize> {
|
||||||
|
let mut divisors = vec![1];
|
||||||
|
|
||||||
|
for divisor in 2..=(number / 2) {
|
||||||
|
if number % divisor == 0 {
|
||||||
|
divisors.push(divisor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
divisors
|
||||||
|
}
|
||||||
|
|
||||||
|
fn d(number: usize) -> usize {
|
||||||
|
proper_divisors(number).iter().sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn amicable_numbers(upper_bound: usize) -> Vec<usize> {
|
||||||
|
let mut amicable_numbers = Vec::new();
|
||||||
|
|
||||||
|
for a in 2..upper_bound {
|
||||||
|
let b = d(a);
|
||||||
|
|
||||||
|
if a != b && d(b) == a {
|
||||||
|
amicable_numbers.push(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
amicable_numbers
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
let sum = amicable_numbers(10_000).iter().sum::<usize>();
|
||||||
|
|
||||||
|
println!("The sum of the first 9,999 amicable numbers is {sum}!");
|
||||||
|
}
|
|
@ -44,6 +44,8 @@ mod three;
|
||||||
mod twelve;
|
mod twelve;
|
||||||
#[path = "../bin/20.rs"]
|
#[path = "../bin/20.rs"]
|
||||||
mod twenty;
|
mod twenty;
|
||||||
|
#[path = "../bin/21.rs"]
|
||||||
|
mod twenty_one;
|
||||||
#[path = "../bin/27.rs"]
|
#[path = "../bin/27.rs"]
|
||||||
mod twenty_seven;
|
mod twenty_seven;
|
||||||
#[path = "../bin/22.rs"]
|
#[path = "../bin/22.rs"]
|
||||||
|
@ -90,6 +92,7 @@ pub async fn execute(
|
||||||
67 => sixty_seven::main(),
|
67 => sixty_seven::main(),
|
||||||
19 => nineteen::main(),
|
19 => nineteen::main(),
|
||||||
20 => twenty::main(),
|
20 => twenty::main(),
|
||||||
|
21 => twenty_one::main(),
|
||||||
_ => {
|
_ => {
|
||||||
exists = false;
|
exists = false;
|
||||||
println!(
|
println!(
|
||||||
|
|
Loading…
Reference in a new issue