Largest proper divisor of n: Difference between revisions

Content added Content deleted
(Added Algol W)
(→‎{{header|Haskell}}: Added a variant which only checks the first two proper divisors (if there are that many))
Line 266:
printf "%3d" . lpd <$> [1 .. 100]</lang>
{{out}}
<pre> 1 1 1 2 1 3 1 4 3 5
1 6 1 7 5 8 1 9 1 10
7 11 1 12 5 13 9 14 1 15
1 16 11 17 7 18 1 19 13 20
1 21 1 22 15 23 1 24 7 25
17 26 1 27 11 28 19 29 1 30
1 31 21 32 13 33 1 34 23 35
1 36 1 37 25 38 11 39 1 40
27 41 1 42 17 43 29 44 1 45
13 46 31 47 19 48 1 49 33 50</pre>
 
Or, considering the two smallest proper divisors:
 
(If there are two, then the largest proper divisor will be N divided by the first proper divisor that is not 1)
 
(Otherwise, the largest proper divisor will be 1 itself).
 
<lang haskell>import Data.List.Split (chunksOf)
import Text.Printf (printf)
 
maxProperDivisors :: Int -> Int
maxProperDivisors n
| 1 < length ab = quot n (last ab)
| otherwise = 1
where
root = (floor . sqrt) (fromIntegral n :: Double)
ab = take 2 $ [1 .. root] >>= (\x -> [x | 0 == rem n x])
main :: IO ()
main =
(putStr . unlines . map concat . chunksOf 10) $
printf "%3d" . maxProperDivisors <$> [1 .. 100]</lang>
 
<pre> 1 1 1 2 1 3 1 4 3 5
1 6 1 7 5 8 1 9 1 10