Попытка проверить цифры, которые делят исходное число на haskell - PullRequest
1 голос
/ 05 марта 2020

Haskell Проблема с кодом Описание: Код должен возвращать, сколько цифр в числе делит число на целое. Например, 12 имеет две цифры [1, 2], обе из которых делят 2 (12% 2 и 12% 1 оба равны 0), поэтому возвращается 2, поскольку есть две цифры, которые делят число. Для 102 2 возвращается как 1, а 2 оба делят 102, деление на 0 не определено.

Однако, с этим кодом я получаю ошибки с числами, содержащими 0 в середине числа (например, 1001020), которые я получаю «Ошибка программы: Prelude.read: no parse»

Любая помощь будет принята с благодарностью. Большое спасибо.

import Control.Monad
import Data.Array
import Data.Bits
import Data.Char
import Data.List
import Data.Set
import Debug.Trace
import System.Environment
import System.IO
import System.IO.Unsafe

findDigits :: Int -> Int
findDigits n = digits n n 0 (lengths n)
    where
        digits n on count endCheck
            | endCheck == 0 = count
            | header n == 0 = digits (tailer n) on count (endCheck-1)
            | on `mod` header n == 0 = digits (tailer n) on (count+1) (endCheck-1)
            | otherwise = digits (tailer n) on count (endCheck-1)

header :: Int -> Int
header x = digitToInt . head . show $ x

tailer :: Int -> Int
tailer x = read . tail . show $ x

lengths :: Int -> Int
lengths x = length . show $ x

1 Ответ

0 голосов
/ 05 марта 2020

Я думаю, вы пытаетесь сделать слишком много в функции. В действительности, лучше работать с небольшими функциями, каждая из которых решает простую задачу, а затем объединять их в функции, которые также малы, и выполнять (немного) более сложную задачу.

Например, мы можем сделать функция digits :: Int -> [Int], которая возвращает список цифр:

digits :: Int -> [Int]
digits x | x >= 10 = r : digits q
         | otherwise = [x]
    where (q,r) = quotRem x 10

Например:

Prelude> digits 102
[2,0,1]

Затем мы можем отфильтровать эти цифры, чтобы проверить, что цифры не равны нулю (с тех пор она не делится), и что число делится на это ди git:

dividableDigits :: Int -> [Int]
dividableDigits n = filter (\x -> x /= 0 && mod n x == 0) (digits n)

Теперь необходимо подсчитать числа, которые совпадают. Я оставляю это как упражнение.

...