Guest User

Untitled

a guest
May 27th, 2014
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.57 KB | None | 0 0
  1. import Control.Monad
  2. import Data.Array.Base
  3. import Data.Array.IO
  4. import System.Environment
  5.  
  6. sieve :: Int -> IO (IOUArray Int Bool)
  7. sieve n = newArray (2, n-1) True >>= loop 2
  8. where loop i a = if i*i > n then return a else do
  9. p <- unsafeRead a i
  10. when p $ mapM_ (\j -> unsafeWrite a j False) [i*i, i*i+i..n-1]
  11. loop (succ i) a
  12.  
  13. main :: IO ()
  14. main = do
  15. name <- getProgName
  16. getArgs >>= \args -> case args of
  17. [n] -> let n' = read n in sieve n' >>= \a -> mapM_ (printIfPrime a) [2..n'-1]
  18. _ -> putStrLn $ "usage: " ++ name ++ " N"
  19. where printIfPrime a i = unsafeRead a i >>= \p -> when p $ putStrLn (show i)
  20.  
  21. vs.
  22.  
  23. import java.util.Arrays;
  24.  
  25. public class Sieve {
  26.  
  27. private static void printPrimes(boolean[] arr) {
  28. for (int i=2; i<arr.length; i++)
  29. if (arr[i])
  30. System.out.println(i);
  31. }
  32.  
  33. private static boolean[] sieve(boolean[] arr) {
  34. for (int i=2; i*i <= arr.length; i++)
  35. for (int j=i*i; arr[i] && j < arr.length; j+=i)
  36. arr[j] = false;
  37. return arr;
  38. }
  39.  
  40. public static void main(String[] args) {
  41. if (args.length != 1) {
  42. System.out.println("usage: java Sieve N");
  43. System.exit(1);
  44. }
  45.  
  46. int n = Integer.parseInt(args[0]);
  47. if (n < 0) {
  48. System.out.println("abort (N < 0)");
  49. System.exit(1);
  50. }
  51.  
  52. boolean[] a = new boolean[n];
  53. Arrays.fill(a, true);
  54. boolean[] primes = sieve(a);
  55. printPrimes(primes);
  56.  
  57. }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment