From 5d6c47106d2c9c5682ae8147ca6e665ffca5185e Mon Sep 17 00:00:00 2001 From: newt Date: Wed, 9 Oct 2024 18:10:10 +0100 Subject: [PATCH] feat(problem): 12 - highly divisible triangle number --- readme.md | 4 ++-- src/bin/12.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/bin/12.rs diff --git a/readme.md b/readme.md index d7e2e26..5beb938 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ All of the solutions here are written in rust. [main.rs](src/main.rs) is the hom ## Challenge Completion -### 11 out of 100 public challenges completed. +### 12 out of 100 public challenges completed. - [x] 1 - [Multiples of 3 or 5](src/bin/1.rs) - [x] 2 - [Even Fibonacci numbers](src/bin/2.rs) @@ -22,7 +22,7 @@ All of the solutions here are written in rust. [main.rs](src/main.rs) is the hom - [x] 9 - [Special Pythagorean triplet](src/bin/9.rs) - [x] 10 - [Summation of primes](src/bin/10.rs) - [x] 11 - [Largest product in a grid](src/bin/11.rs) -- [ ] 12 - Highly divisible triangular number +- [x] 12 - [Highly divisible triangular number](src/bin/12.rs) - [ ] 13 - Large sum - [ ] 14 - Longest Collatz sequence - [ ] 15 - Lattice paths diff --git a/src/bin/12.rs b/src/bin/12.rs new file mode 100644 index 0000000..bf5ab46 --- /dev/null +++ b/src/bin/12.rs @@ -0,0 +1,47 @@ +/* +Problem 12 - Highly divisible triangular number + +The sequence of triangle numbers is generated by adding the natural numbers. So the 7 th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be: +1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... +Let us list the factors of the first seven triangle numbers: +1 : 1  3 : 1,3  6 : 1,2,3,6 10 : 1,2,5,10 15 : 1,3,5,15 21 : 1,3,7,21 28 : 1,2,4,7,14,28 +We can see that 28 is the first triangle number to have over five divisors. +What is the value of the first triangle number to have over five hundred divisors? +*/ + +fn factors(number: usize) -> Vec> { + let max = (number as f64).sqrt() as usize; + let mut factors: Vec> = vec![vec![1, number]]; + let is_even = number % 2 == 0; + + for current_factor in (if is_even {2} else {3})..(max + 1) { + if number % current_factor != 0 { + continue; + } + + factors.push(vec![current_factor, number / current_factor]); + } + + return factors; +} + +fn first_triangle_with_n_divisors(n: usize) -> usize { + let mut i = 1; + + loop { + let triangle = (i * (i + 1)) / 2; + let factors = factors(triangle); + + if factors.len() * 2 > n { + return triangle; + } + + i += 1; + } +} + +fn main() { + let value = first_triangle_with_n_divisors(500); + + println!("The first triangle number with over 500 divisors is {value}"); +}