44 lines
1.0 KiB
Rust
44 lines
1.0 KiB
Rust
use std::str::FromStr;
|
||
|
||
use primal::is_prime;
|
||
|
||
// 有0,2, 4, 5, 6, 8的,必然不是
|
||
fn is_circular_prime(num: u32) -> bool {
|
||
if num == 2 || num == 3 || num == 5 || num == 7 {
|
||
return true;
|
||
}
|
||
let mut str_num = num.to_string();
|
||
if str_num.contains("0")
|
||
|| str_num.contains("2")
|
||
|| str_num.contains("4")
|
||
|| str_num.contains("5")
|
||
|| str_num.contains("6")
|
||
|| str_num.contains("8")
|
||
{
|
||
return false;
|
||
}
|
||
|
||
for _ in 0..str_num.len() {
|
||
let num = u32::from_str(&str_num).unwrap();
|
||
if !is_prime(num as u64) {
|
||
return false;
|
||
}
|
||
str_num = str_num[1..str_num.len()].to_string() + &str_num[0..1];
|
||
}
|
||
|
||
true
|
||
}
|
||
#[test]
|
||
fn test_is_circular_prime() {
|
||
assert!(is_circular_prime(2));
|
||
assert!(is_circular_prime(5));
|
||
assert!(is_circular_prime(13));
|
||
assert!(!is_circular_prime(4));
|
||
assert!(is_circular_prime(197));
|
||
}
|
||
|
||
fn main() {
|
||
let count = (0..1000000u32).filter(|x| is_circular_prime(*x)).count();
|
||
println!("{count}");
|
||
}
|