mirror of https://github.com/sunface/rust-course
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
889 B
42 lines
889 B
3 years ago
|
# 质数筛法
|
||
|
|
||
|
```rust
|
||
|
pub fn prime_numbers(max: usize) -> Vec<usize> {
|
||
|
let mut result: Vec<usize> = Vec::new();
|
||
|
|
||
|
if max >= 2 {
|
||
|
result.push(2)
|
||
|
}
|
||
|
for i in (3..max + 1).step_by(2) {
|
||
|
let stop: usize = (i as f64).sqrt() as usize + 1;
|
||
|
let mut status: bool = true;
|
||
|
|
||
|
for j in (3..stop).step_by(2) {
|
||
|
if i % j == 0 {
|
||
|
status = false
|
||
|
}
|
||
|
}
|
||
|
if status {
|
||
|
result.push(i)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
result
|
||
|
}
|
||
|
|
||
|
#[cfg(test)]
|
||
|
mod tests {
|
||
|
use super::*;
|
||
|
|
||
|
#[test]
|
||
|
fn basic() {
|
||
|
assert_eq!(prime_numbers(0), vec![]);
|
||
|
assert_eq!(prime_numbers(11), vec![2, 3, 5, 7, 11]);
|
||
|
assert_eq!(prime_numbers(25), vec![2, 3, 5, 7, 11, 13, 17, 19, 23]);
|
||
|
assert_eq!(
|
||
|
prime_numbers(33),
|
||
|
vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
```
|