rust solutions problems 2 and 3
parent
4c6bfa1821
commit
32ae71cf32
|
@ -1 +1,5 @@
|
|||
pub mod prime;
|
||||
|
||||
pub mod problem_001;
|
||||
pub mod problem_002;
|
||||
pub mod problem_003;
|
|
@ -0,0 +1,53 @@
|
|||
fn subfactors(mut n: u64, p: u64) -> (u64, Vec<u64>) {
|
||||
let mut subfactors = Vec::new();
|
||||
|
||||
let mut q = n / p;
|
||||
let mut r = n % p;
|
||||
|
||||
while r == 0 {
|
||||
subfactors.push(p);
|
||||
n = q;
|
||||
q = n / p;
|
||||
r = n % p;
|
||||
}
|
||||
|
||||
return (n, subfactors);
|
||||
}
|
||||
|
||||
pub fn trial_factorization(mut n: u64) -> Vec<u64> {
|
||||
let mut factors = Vec::new();
|
||||
|
||||
let (num, division_by_two) = subfactors(n, 2);
|
||||
n = num; // is there a clean way to avoid this assignment?
|
||||
factors.extend(division_by_two);
|
||||
|
||||
let (num, division_by_three) = subfactors(n, 3);
|
||||
n = num;
|
||||
factors.extend(division_by_three);
|
||||
|
||||
let mut p = 5;
|
||||
while p * p <= n
|
||||
{
|
||||
let (num, division_by_p) = subfactors(n, p);
|
||||
n = num;
|
||||
factors.extend(division_by_p);
|
||||
p += 2;
|
||||
|
||||
let (num, division_by_p_plus_two) = subfactors(n, p);
|
||||
n = num;
|
||||
factors.extend(division_by_p_plus_two);
|
||||
p += 4;
|
||||
}
|
||||
if n >= 1 { factors.push(n); }
|
||||
return factors;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use euler::prime::trial_factorization;
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
assert_eq!(trial_factorization(20).len(), 3);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
struct Fibonacci {
|
||||
curr: u32,
|
||||
next: u32,
|
||||
}
|
||||
|
||||
impl Iterator for Fibonacci {
|
||||
type Item = u32;
|
||||
|
||||
fn next(&mut self) -> Option<u32> {
|
||||
let new = self.curr + self.next;
|
||||
|
||||
self.curr = self.next;
|
||||
self.next = new;
|
||||
|
||||
Some(self.curr)
|
||||
}
|
||||
}
|
||||
|
||||
fn fibonacci() -> Fibonacci {
|
||||
Fibonacci { curr: 1, next: 1 }
|
||||
}
|
||||
|
||||
fn fibonacci_sum_up_to(number: u32) -> u32 {
|
||||
return fibonacci().take_while(|n| n < &number).filter(|n| n % 2 == 0).sum();
|
||||
}
|
||||
|
||||
fn solution() -> u32 {
|
||||
return fibonacci_sum_up_to(4000000);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use euler::problem_002::solution;
|
||||
|
||||
#[test]
|
||||
fn problem_002() {
|
||||
assert_eq!(solution(), 4613732);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
use euler::prime;
|
||||
|
||||
fn solution() -> Option<u64> {
|
||||
return prime::trial_factorization(600851475143).last().cloned();
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use euler::problem_003::solution;
|
||||
|
||||
#[test]
|
||||
fn problem_003() {
|
||||
assert_eq!(solution().unwrap(), 6857);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue