36 lines
922 B
Haskell
36 lines
922 B
Haskell
import Text.Read (readMaybe)
|
|
import System.Exit (exitSuccess)
|
|
|
|
|
|
main :: IO ()
|
|
main = do
|
|
n <- askNumber
|
|
let (d, root) = findIntegerSqrt n
|
|
q = (root - d)
|
|
p = (root + d)
|
|
putStrLn ("n = " ++ show n)
|
|
putStrLn ("Found d = " ++ show d ++ ", sqrt(n + d^2) = " ++ show root)
|
|
putStrLn ("q = " ++ show q ++ ", p = " ++ show p)
|
|
|
|
|
|
askNumber :: IO Int
|
|
askNumber = do
|
|
putStrLn "Enter an integer:"
|
|
input <- getLine
|
|
case readMaybe input :: Maybe Int of
|
|
Just n -> return n
|
|
Nothing -> do
|
|
putStrLn "Not a valid integer!"
|
|
exitSuccess
|
|
|
|
-- Find the smallest integer d >= 0 such that sqrt(n + d^2) is an integer
|
|
findIntegerSqrt :: Int -> (Int, Int)
|
|
findIntegerSqrt n = go 0
|
|
where
|
|
go d =
|
|
let val = n + d*d
|
|
root = floor (sqrt (fromIntegral val))
|
|
in if root * root == val
|
|
then (d, root)
|
|
else go (d + 1)
|