N-smooth numbers: Difference between revisions
Content added Content deleted
(qualify task requirements [“calculate”] otherwise a few `printf` would be sufficient, →Pascal: standardize [use language as per ISO specifications], resolve {{incorrect}}]) |
m (Rust - task doesn't need arbitrary precision integers, 128-bit is sufficient.) |
||
Line 3,258: | Line 3,258: | ||
=={{header|Rust}}== |
=={{header|Rust}}== |
||
{{trans|C}} |
{{trans|C}} |
||
<lang rust> |
<lang rust>fn is_prime(n: u32) -> bool { |
||
// rug = "1.8" |
|||
fn is_prime(n: u32) -> bool { |
|||
if n < 2 { |
if n < 2 { |
||
return false; |
return false; |
||
Line 3,295: | Line 3,292: | ||
} |
} |
||
fn find_nsmooth_numbers(n: u32, count: usize) -> Vec< |
fn find_nsmooth_numbers(n: u32, count: usize) -> Vec<u128> { |
||
use rug::{Assign, Integer}; |
|||
let primes = find_primes(2, n); |
let primes = find_primes(2, n); |
||
let num_primes = primes.len(); |
let num_primes = primes.len(); |
||
Line 3,304: | Line 3,300: | ||
for i in 0..num_primes { |
for i in 0..num_primes { |
||
index.push(0); |
index.push(0); |
||
queue.push |
queue.push(primes[i] as u128); |
||
} |
} |
||
result.push |
result.push(1); |
||
for i in 1..count { |
for i in 1..count { |
||
for p in 0..num_primes { |
for p in 0..num_primes { |
||
if queue[p] == result[i - 1] { |
if queue[p] == result[i - 1] { |
||
index[p] += 1; |
index[p] += 1; |
||
queue[p] |
queue[p] = result[index[p]] * primes[p] as u128; |
||
} |
} |
||
} |
} |
||
Line 3,320: | Line 3,316: | ||
} |
} |
||
} |
} |
||
result.push( |
result.push(queue[min_index]); |
||
} |
} |
||
result |
result |