m03r

Разложение на два квадрата

Mar 8th, 2012
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Data.List
  2.  
  3. getExactDiff :: Int -> Int -> [Int]
  4. getExactDiff n quad = [floor d, ceiling d]
  5.     where
  6.         d = fromIntegral ( abs (n - quad*quad) ) ** 0.5
  7.  
  8. compareVar :: (Int, Int, Int) -> (Int, Int, Int) -> Ordering
  9. compareVar (_, q1, a1) (_, q2, a2)
  10.     | abs(a1) /= abs(a2) = compare (abs a1) (abs a2)
  11.     | otherwise = compare q1 q2
  12.        
  13. getPairs :: Int -> [(Int, Int, Int)]
  14. getPairs n =
  15.     sortBy compareVar [(p, q, p*p+q*q-n) | p <- [1..n_root], q <- (getExactDiff n p), p <= q, q > 0]
  16.     where
  17.         n_root = ceiling (fromIntegral n ** 0.5)
  18.    
  19. getVariant :: Int -> (Int, Int, Int)
  20. getVariant = head . getPairs
  21.  
  22. main = do
  23.     putStrLn "Enter number:"
  24.     num <- getLine
  25.     let result = getVariant (read num)
  26.     putStrLn (show result)
Advertisement
Add Comment
Please, Sign In to add comment