IntStream
обеспечивает прекрасный краткий расчет.
static int sigma(int exp, int num) {
IntStream.rangeClosed(1, num) // 1, ..., num
.filter(k -> num % k == 0) // Only divisors
.map(k -> pow(k, exp))
.sum();
}
static int pow(int k, int exp) {
if (exp == 0) {
return 1;
}
int squareRoot = pow(k, exp/2);
int n = squareRoot * squareRoot;
return (exp % 2) == 0 ? n : n*k;
}
Расчет мощности можно оптимизировать, используя не exp
# умножения k
, а квадратные корни.
Для тех, кто заинтересован в преобразовании программы:
pow(k, exp)
нужно полагаться только на exp
с рекурсией в exp / 2 (целочисленное деление). Таким образом, вы можете вывернуть код наизнанку, иметь вектор делителей,
и оперируем этим.