Skip to content

Commit 400d49b

Browse files
m3
1 parent a773f66 commit 400d49b

File tree

3 files changed

+114
-14
lines changed

3 files changed

+114
-14
lines changed

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub mod m1;
22
pub mod m2;
3+
pub mod m3;
34

45
#[cfg(test)]
56
mod tests {

src/m2.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,16 @@ pub fn sum_of_even_fibonacci_sequence_less_than_4000000() -> i64 {
2323
let mut sum = 0;
2424
let mut prepre = 0i64;
2525
let mut pre = 0i64;
26-
loop {
26+
while pre < 4_000_000 {
27+
if pre % 2 == 0 {
28+
sum += pre;
29+
}
2730
{
2831
let tuple = fib(prepre, pre);
2932
prepre = tuple.0;
3033
pre = tuple.1;
3134
}
3235
println!("num {}", pre);
33-
if pre > 4_000_000 {
34-
break;
35-
}
36-
if pre % 2 == 0 {
37-
sum += pre;
38-
}
3936
}
4037
sum
4138
}
@@ -69,20 +66,17 @@ pub fn sum_of_even_fibonacci_sequence_less_than_4000000_011_235_8() -> i64 {
6966
let mut preprepre = 0i64;
7067
let mut prepre = 1i64;
7168
let mut pre = 1i64;
72-
loop {
69+
while preprepre < 4_000_000 {
70+
if preprepre % 2 == 0 {
71+
sum += preprepre;
72+
}
7373
{
7474
let tuple = fib(preprepre, prepre, pre);
7575
preprepre = tuple.0;
7676
prepre = tuple.1;
7777
pre = tuple.2
7878
}
7979
println!("num {}", preprepre);
80-
if preprepre > 4_000_000 {
81-
break;
82-
}
83-
if preprepre % 2 == 0 {
84-
sum += preprepre;
85-
}
8680
}
8781
sum
8882
}

src/m3.rs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/// The prime factors of 13195 are 5, 7, 13 and 29.
2+
///
3+
/// What is the largest prime factor of the number 600851475143 ?
4+
///
5+
/// ```rust
6+
/// use self::project_euler::m3::largest_prime_factor_of_the_number_600851475143;
7+
/// assert_eq!(largest_prime_factor_of_the_number_600851475143(), 6857);
8+
/// ```
9+
pub fn largest_prime_factor_of_the_number_600851475143() -> u64 {
10+
let mut n = 600851475143u64;
11+
let mut diviser = 2u64;
12+
let mut max_factor = 0u64;
13+
// 16 -> 2 * 8 -> 2 * 4 -> 2 * 2 -> 2 * 1
14+
// 21 -> 3 * 7 -> 7 * 1
15+
// 28 -> 2 * 14 -> 2 * 7 -> 7 * 1
16+
while n != 0 && n != 1 {
17+
if n % diviser != 0 {
18+
diviser += 1;
19+
} else {
20+
max_factor = n;
21+
n = n / diviser;
22+
}
23+
}
24+
max_factor
25+
}
26+
27+
/// The prime factors of 13195 are 5, 7, 13 and 29.
28+
///
29+
/// What is the largest prime factor of the number 600851475143 ?
30+
///
31+
/// ```rust
32+
/// use self::project_euler::m3::largest_prime_factor_of_the_number_600851475143_skip_4_6_8_10_12;
33+
/// assert_eq!(largest_prime_factor_of_the_number_600851475143_skip_4_6_8_10_12(), 6857);
34+
/// ```
35+
pub fn largest_prime_factor_of_the_number_600851475143_skip_4_6_8_10_12() -> u64 {
36+
let mut n = 600851475143u64;
37+
let mut diviser = 3u64;
38+
let mut max_factor;
39+
40+
if n % 2 == 0 {
41+
n /= 2;
42+
max_factor = 2;
43+
while n % 2 == 0 {
44+
n /= 2;
45+
}
46+
} else {
47+
max_factor = 1;
48+
}
49+
50+
while n > 1 {
51+
if n % diviser == 0 {
52+
n /= diviser;
53+
max_factor = diviser;
54+
while n % diviser == 0 {
55+
n /= diviser
56+
}
57+
} else {
58+
diviser += 2
59+
}
60+
}
61+
max_factor
62+
}
63+
64+
/// The prime factors of 13195 are 5, 7, 13 and 29.
65+
///
66+
/// What is the largest prime factor of the number 600851475143 ?
67+
///
68+
/// ```rust
69+
/// use self::project_euler::m3::largest_prime_factor_of_the_number_600851475143_skip_4_6_8_10_12_n_ab;
70+
/// assert_eq!(largest_prime_factor_of_the_number_600851475143_skip_4_6_8_10_12_n_ab(), 6857);
71+
/// ```
72+
pub fn largest_prime_factor_of_the_number_600851475143_skip_4_6_8_10_12_n_ab() -> u64 {
73+
let mut n = 600851475143u64;
74+
let mut diviser = 3u64;
75+
let mut max_factor;
76+
77+
if n % 2 == 0 {
78+
n /= 2;
79+
max_factor = 2;
80+
while n % 2 == 0 {
81+
n /= 2;
82+
}
83+
} else {
84+
max_factor = 1;
85+
}
86+
87+
// n = 1 * n || n = a * b
88+
// in square, n = sqrt(n) * sqrt(n)
89+
// pattern 1: a = sqrt(n) && b = sqrt(n)
90+
// pattern 2: a <= sqrt(n) || b <= sqrt(n)
91+
// impossible: a > sqrt(n) && b >= sqrt(n)
92+
let a = (n as f64).sqrt() as u64;
93+
while n > 1 && diviser <= a {
94+
if n % diviser == 0 {
95+
n /= diviser;
96+
max_factor = diviser;
97+
while n % diviser == 0 {
98+
n /= diviser
99+
}
100+
} else {
101+
diviser += 2
102+
}
103+
}
104+
max_factor
105+
}

0 commit comments

Comments
 (0)