Skip to content

Commit 969183e

Browse files
committed
1-8
0 parents  commit 969183e

File tree

12 files changed

+173
-0
lines changed

12 files changed

+173
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/target

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "project_euler"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]

src/bin/1.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
fn main() {
2+
let mut result = 0;
3+
for i in 1..1000 {
4+
if i % 3 == 0 || i % 5 == 0 {
5+
result += i;
6+
}
7+
}
8+
println!("{}", result);
9+
}

src/bin/2.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
fn main() {
2+
let mut result = 0;
3+
let mut a = 1;
4+
let mut b = 2;
5+
while b <= 4_000_000 {
6+
if b % 2 == 0 {
7+
result += b;
8+
}
9+
let c = a + b;
10+
a = b;
11+
b = c;
12+
}
13+
println!("{}", result);
14+
}

src/bin/3.rs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use project_euler::*;
2+
3+
fn main() {
4+
let mut n = 600851475143;
5+
let mut factor = get_smallest_prime_factor(n);
6+
while factor != n {
7+
n /= factor;
8+
factor = get_smallest_prime_factor(n);
9+
}
10+
println!("{}", factor);
11+
}

src/bin/4.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use project_euler::*;
2+
3+
fn main() {
4+
let mut result = 0;
5+
for i in 100..1000 {
6+
for j in i..1000 {
7+
let product = i * j;
8+
if is_palindromic(product) {
9+
result = result.max(product);
10+
}
11+
}
12+
}
13+
println!("{}", result);
14+
}

src/bin/5.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
fn main() {
2+
let mut nums: Vec<_> = (2..21).collect();
3+
let mut result = 1;
4+
let mut index = 0;
5+
while index < nums.len() {
6+
let num = nums[index];
7+
result *= num;
8+
index += 1;
9+
for n in &mut nums[index..] {
10+
if *n % num == 0 {
11+
*n /= num;
12+
}
13+
}
14+
}
15+
println!("{}", result);
16+
}

src/bin/6.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
fn main() {
2+
let mut sum = 0;
3+
let mut square_sum = 0;
4+
for n in 1..=100 {
5+
sum += n;
6+
square_sum += n * n;
7+
}
8+
println!("{}", sum * sum - square_sum);
9+
}

src/bin/7.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use project_euler::*;
2+
3+
fn main() {
4+
let mut n = 2;
5+
let mut count = 0;
6+
while count < 10_001 {
7+
if is_prime(n) {
8+
println!("{}", n);
9+
count += 1;
10+
}
11+
n += 1;
12+
}
13+
println!("{}", n - 1);
14+
}

src/bin/8.rs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const LEN: usize = 13;
2+
3+
fn find_nonzero_product(seq: &[u8], index: usize) -> (u64, usize) {
4+
let mut result = 1u64;
5+
if index + LEN >= seq.len() {
6+
return (0, seq.len());
7+
}
8+
for i in index..(index + LEN) {
9+
let n = seq[i];
10+
if n == b'0' {
11+
return find_nonzero_product(seq, i + 1);
12+
}
13+
result *= (n - b'0') as u64
14+
}
15+
(result, index + LEN)
16+
}
17+
18+
fn main() {
19+
let seq = b"7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
20+
let (mut current, mut index) = find_nonzero_product(seq, 0);
21+
let mut result = current;
22+
while index < seq.len() {
23+
if seq[index] == b'0' {
24+
let product = find_nonzero_product(seq, index + 1);
25+
current = product.0;
26+
index = product.1;
27+
} else {
28+
current /= (seq[index - LEN] - b'0') as u64;
29+
current *= (seq[index] - b'0') as u64;
30+
index += 1;
31+
}
32+
result = result.max(current);
33+
}
34+
println!("{}", result);
35+
}

src/lib.rs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
pub fn get_smallest_prime_factor(n: u64) -> u64 {
2+
for i in 2..=(n / 2) {
3+
if n % i == 0 {
4+
return i;
5+
}
6+
}
7+
n
8+
}
9+
10+
pub fn is_prime(n: u64) -> bool {
11+
get_smallest_prime_factor(n) == n
12+
}
13+
14+
pub fn is_palindromic(n: u64) -> bool {
15+
is_palindromic_chars(number_to_reverse_chars(n))
16+
}
17+
18+
pub fn number_to_reverse_chars(mut n: u64) -> Vec<u8> {
19+
let mut result = vec![];
20+
while n > 0 {
21+
result.push((n % 10) as u8);
22+
n /= 10;
23+
}
24+
result
25+
}
26+
27+
pub fn is_palindromic_chars(chars: Vec<u8>) -> bool {
28+
let end = chars.len() / 2 + 1;
29+
for i in 0..end {
30+
if chars[i] != chars[chars.len() - i - 1] {
31+
return false;
32+
}
33+
}
34+
true
35+
}

0 commit comments

Comments
 (0)