RosettaCodeData/Task/Almost-prime/Rust/almost-prime.rust

40 lines
749 B
Text
Raw Permalink Normal View History

2015-11-18 06:14:39 +00:00
fn is_kprime(n: u32, k: u32) -> bool {
let mut primes = 0;
let mut f = 2;
let mut rem = n;
while primes < k && rem > 1{
while (rem % f) == 0 && rem > 1{
rem /= f;
primes += 1;
}
f += 1;
}
rem == 1 && primes == k
2015-02-20 09:02:09 -05:00
}
struct KPrimeGen {
2015-11-18 06:14:39 +00:00
k: u32,
n: u32,
2015-02-20 09:02:09 -05:00
}
impl Iterator for KPrimeGen {
2015-11-18 06:14:39 +00:00
type Item = u32;
fn next(&mut self) -> Option<u32> {
self.n += 1;
while !is_kprime(self.n, self.k) {
self.n += 1;
}
Some(self.n)
}
2015-02-20 09:02:09 -05:00
}
2015-11-18 06:14:39 +00:00
fn kprime_generator(k: u32) -> KPrimeGen {
KPrimeGen {k: k, n: 1}
2015-02-20 09:02:09 -05:00
}
fn main() {
2015-11-18 06:14:39 +00:00
for k in 1..6 {
println!("{}: {:?}", k, kprime_generator(k).take(10).collect::<Vec<_>>());
}
2015-02-20 09:02:09 -05:00
}