Open1

AtCoderで使うテクニック

AntiSatoriAntiSatori

約数列挙

想定問題

https://atcoder.jp/contests/abc180/tasks/abc180_c

定義

正の整数Nに対してNを割り切れる数、全ての約数を求めること。

例: 40の約数列挙 -> 1, 2, 4, 5, 8, 10, 20, 40

手順

  1. i = 1の変数を定義する。
  2. i * i が N よりも大きくなった場合計算を終了する。
  3. Nがiで割り切れた場合、約数にiを追加する。
  4. iをNで割った数字がまだ約数に追加されていない場合、約数に追加する。
  5. iの数に1を足す。
  6. 2に戻る。

コード

Haskell

solve :: Integer -> Integer -> [Integer] -> [Integer]
solve n m acc
  | m ^ (2 :: Integer) > n = acc
  | n `mod` m == 0          = solve n (m + 1) (dividable n m) ++ acc
  | otherwise               = solve n (m + 1) acc
  where
    dividable i j
      | j /= (i `div` j) = [j, i `div` j]
      | otherwise      = [j]