72 lines
1.3 KiB
Plaintext
72 lines
1.3 KiB
Plaintext
fn is_prime(n: u32) -> bool {
|
|
if n < 2 {
|
|
return false;
|
|
}
|
|
if n % 2 == 0 {
|
|
return n == 2;
|
|
}
|
|
if n % 3 == 0 {
|
|
return n == 3;
|
|
}
|
|
let mut p = 5;
|
|
while p * p <= n {
|
|
if n % p == 0 {
|
|
return false;
|
|
}
|
|
p += 2;
|
|
if n % p == 0 {
|
|
return false;
|
|
}
|
|
p += 4;
|
|
}
|
|
true
|
|
}
|
|
|
|
fn is_left_truncatable(p: u32) -> bool {
|
|
let mut n = 10;
|
|
let mut q = p;
|
|
while p > n {
|
|
if !is_prime(p % n) || q == p % n {
|
|
return false;
|
|
}
|
|
q = p % n;
|
|
n *= 10;
|
|
}
|
|
true
|
|
}
|
|
|
|
fn is_right_truncatable(p: u32) -> bool {
|
|
let mut q = p / 10;
|
|
while q > 0 {
|
|
if !is_prime(q) {
|
|
return false;
|
|
}
|
|
q /= 10;
|
|
}
|
|
true
|
|
}
|
|
|
|
fn main() {
|
|
let limit = 1000000;
|
|
let mut largest_left = 0;
|
|
let mut largest_right = 0;
|
|
let mut p = limit;
|
|
while p >= 2 {
|
|
if is_prime(p) && is_left_truncatable(p) {
|
|
largest_left = p;
|
|
break;
|
|
}
|
|
p -= 1;
|
|
}
|
|
println!("Largest left truncatable prime is {}", largest_left);
|
|
p = limit;
|
|
while p >= 2 {
|
|
if is_prime(p) && is_right_truncatable(p) {
|
|
largest_right = p;
|
|
break;
|
|
}
|
|
p -= 1;
|
|
}
|
|
println!("Largest right truncatable prime is {}", largest_right);
|
|
}
|