Certes, div
et mod
sont plus rapides, mais pourquoi pas? Je suppose que le problème est la conversion d'un numéro à une liste de chiffres:
toDigits = map (read . (:[])) . show
56518
est converti en une chaîne "56518"
, et chaque symbole dans la chaîne (chaque chiffre) est converti en une chaîne elle-même avec map (:[])
, à ce point nous avons ["5","6","5","1","8"]
, et nous lisons chaque chaîne à un seul chiffre comme une valeur entière: [5,6,5,1,8]
. Terminé.
Maintenant, nous pouvons calculer la somme des chiffres de cette façon:
sumDigits x = sum (zipWith (*) (cycle [1,-1]) (reverse (toDigits x)))
cycle [1,-1]
fait une liste infinie [1, -1, 1, -1, ...]
, que nous jumelons la liste inversée de chiffres (toDigit x
), et multiplier les éléments de chaque paire. Nous avons donc [8, -1, 5, -6, 5]
et sa somme.
Maintenant, nous pouvons le faire récursive:
isDivisible x
| x == 11 || x == 0 = True
| x < 11 = False
| x > 11 = isDivisible (sumDigits x)
ya un problème avec l'aide modulo? – delnan
@Justin ifan signifie le '.' comme un séparateur entre des milliers et des unités, pas un point décimal. – Yitz
@Justin: Dans certains endroits, '.' est utilisé comme séparateur 1000 (et', 'pour le point décimal), donc il voulait probablement dire' 56518'. – sepp2k