diff --git a/projecteuler/094/Cargo.toml b/projecteuler/094/Cargo.toml new file mode 100644 index 0000000..fca4e93 --- /dev/null +++ b/projecteuler/094/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "main" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/projecteuler/094/src/main.rs b/projecteuler/094/src/main.rs new file mode 100644 index 0000000..280f09c --- /dev/null +++ b/projecteuler/094/src/main.rs @@ -0,0 +1,47 @@ +use std::time::Instant; + +fn check_triangle(two_sides: u64, one_side: u64) -> bool { + let c = 4 * two_sides * two_sides - one_side * one_side; + let r = (c as f64).sqrt() as u64; + + // println!("{} {}", two_sides, r); + return r * r == c && r > 0; +} + +fn main() { + println!("Hello, this is Patrick!"); + let now = Instant::now(); + + const MAX_PERIMETER: u64 = 1000000000; + + let mut perimeter_sum = 0; + + let mut i = 1; + loop { + if 3 * i - 1 > MAX_PERIMETER { + break; + } + // First check the case where the single side is equal to i - 1 + if i > 1 && check_triangle(i, i - 1) { + perimeter_sum += 3 * i - 1; + } + + // Then check the case where the single side is equal to i + 1 + if 3 * i + 1 <= MAX_PERIMETER && check_triangle(i, i + 1) { + perimeter_sum += 3 * i + 1; + } + + i += 1; + } + + println!( + "Sum of perimeters of almost equilateral triangles with integral side is: {}", + perimeter_sum + ); + println!("Time passed: {:?}", Instant::now() - now); +} + +#[test] +fn check() { + assert!(check_triangle(5, 6)); +}