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