solution 5
parent
c1dfb112db
commit
727c36e795
|
@ -0,0 +1,8 @@
|
||||||
|
pub fn gcd(mut a: u64, mut b: u64) -> u64 {
|
||||||
|
while b != 0 {
|
||||||
|
let t = a;
|
||||||
|
a = b;
|
||||||
|
b = t % b;
|
||||||
|
}
|
||||||
|
a
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
pub mod prime;
|
pub mod prime;
|
||||||
|
pub mod math;
|
||||||
|
|
||||||
pub mod problem_001;
|
pub mod problem_001;
|
||||||
pub mod problem_002;
|
pub mod problem_002;
|
||||||
pub mod problem_003;
|
pub mod problem_003;
|
||||||
pub mod problem_004;
|
pub mod problem_004;
|
||||||
|
pub mod problem_005;
|
|
@ -14,7 +14,8 @@ fn subfactors(mut n: u64, p: u64) -> (u64, Vec<u64>) {
|
||||||
(n, subfactors)
|
(n, subfactors)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn trial_factorization(mut n: u64) -> Vec<u64> {
|
pub fn trial_factorization(n: u64) -> Vec<u64> {
|
||||||
|
let mut n = n;
|
||||||
let mut factors = Vec::new();
|
let mut factors = Vec::new();
|
||||||
|
|
||||||
let (num, division_by_two) = subfactors(n, 2);
|
let (num, division_by_two) = subfactors(n, 2);
|
||||||
|
@ -42,6 +43,24 @@ pub fn trial_factorization(mut n: u64) -> Vec<u64> {
|
||||||
factors
|
factors
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn root(n: u64, f: u64) -> u64 {
|
||||||
|
let mut n = n;
|
||||||
|
let mut result = 0;
|
||||||
|
|
||||||
|
while n % f == 0 {
|
||||||
|
result += 1;
|
||||||
|
n /= f;
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn prime_factorization(n: u64) -> Vec<(u64, u64)> {
|
||||||
|
let factors = trial_factorization(n);
|
||||||
|
let exponents = factors.iter().map( |&f| root(n, f) );
|
||||||
|
factors.iter().zip(exponents).map( |(&i, j)| (i, j) ).collect()
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use euler::prime::trial_factorization;
|
use euler::prime::trial_factorization;
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
use euler::math;
|
||||||
|
|
||||||
|
fn smallest_divisible_by_all_up_to(n: u64) -> u64 {
|
||||||
|
(2..n).fold(1, |acc, i| {
|
||||||
|
acc * i / math::gcd(i, acc)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn solution() -> u64 {
|
||||||
|
smallest_divisible_by_all_up_to(20)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use euler::problem_005::solution;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn problem_005() {
|
||||||
|
assert_eq!(solution(), 232_792_560);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue