⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fractran.hs.txt

📁 Ulm大学2003-2004年竞赛题
💻 TXT
字号:
-- Problem   Fractran-- Algorithm Simulation-- Runtime   O(n)-- Author    Walter Guttmann-- Date      2003.09.12import List;import Maybe;main :: IO ()main =  do input <- readFile "fractran.in"     mapM_ (putStrLn . concat . intersperse " " . map show . solve) $ cases $ map read $ words inputcases :: [Int] -> [(Int,PEs,E)]cases (0:_) = []cases (m:n:k:xs) = (m,toPEs n,toPEs2 fs) : cases gs  where (fs,gs) = splitAt (2*k) xssolve :: (Int,PEs,E) -> [Int]solve (m,n0,fs) = take m [ log2 n | n <- iterate (step fs) n0 , is2power n ]step :: E -> PEs -> PEsstep fs n = head [ fromJust x `multiply` num |                   (num,den) <- fs , let x = n `divide` den , isJust x ]-- (prime number,exponent)type PE  = (Int,Int)type PEs = [PE]type E   = [(PEs,PEs)]primes :: [Int]primes = sieve [2..]  where sieve :: [Int] -> [Int]        sieve (p:xs) = p : sieve [ x | x <- xs , x `mod` p /= 0 ]toPEs :: Int -> PEstoPEs = toPEs' primes  where toPEs' :: [Int] -> Int -> PEs        toPEs' _      1         = []        toPEs' (p:ps) x | x > 1 =          let (ds,x':_) = span (\z -> z `mod` p == 0) $ iterate (`div` p) x              lds       = length ds          in [ (p,lds) | lds > 0 ] ++ toPEs' ps x'toPEs2 :: [Int] -> EtoPEs2 [] = []toPEs2 (n:d:xs) = (toPEs n,toPEs d) : toPEs2 xsmultiply :: PEs -> PEs -> PEsmultiply xs           []           = xsmultiply []           ys           = ysmultiply ((xp,xe):xs) ((yp,ye):ys) =  case compare xp yp of    LT -> (xp,xe)    : multiply xs           ((yp,ye):ys)    EQ -> (xp,xe+ye) : multiply xs           ys    GT -> (yp,ye)    : multiply ((xp,xe):xs) ysdivide :: PEs -> PEs -> Maybe PEsdivide xs           []           = Just xsdivide []           (y:ys)       = Nothingdivide ((xp,xe):xs) ((yp,ye):ys) =  case compare xp yp of    LT -> case divide xs ((yp,ye):ys) of            Nothing  -> Nothing            Just pes -> Just ((xp,xe) : pes)    EQ -> case compare xe ye of            LT -> Nothing            EQ -> divide xs ys            GT -> case divide xs ys of                    Nothing  -> Nothing                    Just pes -> Just ((xp,xe-ye) : pes)    GT -> Nothingis2power :: PEs -> Boolis2power pes = null [ e | (p,e) <- pes , p /= 2 ]log2 :: PEs -> Intlog2 [] = 0log2 [(2,e)] = e

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -