Хочу, чтобы git игнорировал файлы с именами [0-9]+ (т.е. состоящими только из цифр, напр. 36 годится, а 36.с нет). Но gitignore понимает только башевские паттерны, в которых непонятно как такое задать.
Ну если нельзя [0-9]+, то хотя бы [^\.]+ (файлы без расширения).
Нужна функия суммы делителей натур. числа. Вместо обычного
sumDivisors n = sum [ k | k <- [1..(n `div` 2)], n `mod` k == 0 ]
лучше проверять делители не до n/2, а до sqrt(n/2), причем если нашли делитель k, то n/k тоже будет делителем. Таким способом исчерпываются все делители. Но надо следить, чтобы один делитель не учитывался дважды.
На си это выглядит так:
uint sumDivisors(uint n)
{
uint m = (uint)sqrt(n);
uint k = 2, sum = 1, tmp;
for (; k <= m; ++k)
if (!(n % k)) {
sum += k;
if (k != (tmp = n/k))
sum += tmp;
}
return sum;
}
(Замечю, что работает это значительно быстрее перебора всех делителей до n/2, особенно на больших n.) На хаскеле я новичок и написал так:
sumDivisors n = 1 + sum' [ k + m | k <- [2..sq],
n `mod` k == 0,
let t = n `div` k
m = if t /= k then t else 0 ] where
sq = floor . sqrt . fromIntegral $ n
Можно это как-нибудь попроще, покрасивее записать (не в ущерб скорости)?