большие экспоненты возвращают 0 (однако я думаю, что это может быть связано с тем фактом, что нам нужно использовать целые числа против длинных.)
Правильно.
int i = (int) 2147483648L; // -2147483648 due to over flow
int j = i * 2; // 0 due to overflow.
Вы можете использовать long
, однако это имеет ту же проблему, но для более высокого значения.
public static long recPower(int baseNum, int power) {
if (power < 0) throw new IllegalArgumentException();
return power == 0 ? 1L : baseNum * recPower(baseNum, power - 1);
}
Один из способов проверить переполнение - это посмотреть
public static long recPower(int baseNum, int power) {
if (power < 0) throw new IllegalArgumentException();
return power == 0 ? 1L : baseNum * recPower(baseNum, power - 1);
}
илипроверка на переполнение
public static long recPower(int baseNum, int power) {
if (power < 0) throw new IllegalArgumentException();
return power == 0 ? 1L
: Math.multiplyExact(baseNum, recPower(baseNum, power - 1));
}
Вы можете использовать BigInteger, который имеет гораздо больший лимит.