Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Monad
- import Data.Array.Base
- import Data.Array.IO
- import System.Environment
- sieve :: Int -> IO (IOUArray Int Bool)
- sieve n = newArray (2, n-1) True >>= loop 2
- where loop i a = if i*i > n then return a else do
- p <- unsafeRead a i
- when p $ mapM_ (\j -> unsafeWrite a j False) [i*i, i*i+i..n-1]
- loop (succ i) a
- main :: IO ()
- main = do
- name <- getProgName
- getArgs >>= \args -> case args of
- [n] -> let n' = read n in sieve n' >>= \a -> mapM_ (printIfPrime a) [2..n'-1]
- _ -> putStrLn $ "usage: " ++ name ++ " N"
- where printIfPrime a i = unsafeRead a i >>= \p -> when p $ putStrLn (show i)
- vs.
- import java.util.Arrays;
- public class Sieve {
- private static void printPrimes(boolean[] arr) {
- for (int i=2; i<arr.length; i++)
- if (arr[i])
- System.out.println(i);
- }
- private static boolean[] sieve(boolean[] arr) {
- for (int i=2; i*i <= arr.length; i++)
- for (int j=i*i; arr[i] && j < arr.length; j+=i)
- arr[j] = false;
- return arr;
- }
- public static void main(String[] args) {
- if (args.length != 1) {
- System.out.println("usage: java Sieve N");
- System.exit(1);
- }
- int n = Integer.parseInt(args[0]);
- if (n < 0) {
- System.out.println("abort (N < 0)");
- System.exit(1);
- }
- boolean[] a = new boolean[n];
- Arrays.fill(a, true);
- boolean[] primes = sieve(a);
- printPrimes(primes);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment