Возведение a в n:
Пускай ni - i-ый бит с конца числа n (начиная с i=0).
Пускай pow(a, n) = a^n (а то замучусь).
Очевидно a^n = a^(n0*2^0 + n1*2^1 + ... + nk*k^k).
a^n = a^(n0*2^0) * a^(n1*2^1) * ... * a^(nk*2^k)
Пускай a[i] = a^(2^i)
Тоесть a^n - произведение a[i], таких, что ni=1
Осталось заметить a[i] = a^(2^i) = a^(2^(i-1) + 2^(i-1)) =
a^2^(i-1) * a^2^(i-1) = a[i-1] * a[i-1] = a[i-1]^2
А вот реализация:
inline int pow(int a, int n)
{
for (int ret=1; n>0; a*=a, n>>=1)
if (n&1)
ret *= a;
return ret;
}
---
Конечно, этот алгоритм есть смысл использовать только на чём-то много большем, чем int, хотя и на int он будет быстрее.
[C++] Возведение в степень офигенных чисел27.11.01 03:34 Автор: Korsh <Мельников Михаил> Статус: Elderman
> Возведение a в n: > Конечно, этот алгоритм есть смысл использовать только на > чём-то много большем, чем int, хотя и на int он будет > быстрее. Проще использавоть банальную рекурсию.
[C++] Возведение в степень офигенных чисел27.11.01 04:36 Автор: Biasha <Бяша> Статус: Member
> Проще использавоть банальную рекурсию. Конкретней, пожалуйста... Что значит проще?
Куда уж проще то - один фор, один иф, 1 и, 1 умножить, 1 сдвиг, и оди "в квадрат".
Да и быстрее особо не придумаешь - разве что у меня можно n>>1 & 1 переделать в цикл по битам n - чтоб не сдвигать.
Ну, ещё последнее умножение - лишнее. Но это, чтоб пример не усложнять.
А чтоб код проще был - так проще for(i=0 ++i<n; result*=a); как ни крути :)
[C++] Возведение в степень офигенных чисел27.11.01 08:00 Автор: Korsh <Мельников Михаил> Статус: Elderman
> > Проще использавоть банальную рекурсию. > Конкретней, пожалуйста... Что значит проще? > Куда уж проще то - один фор, один иф, 1 и, 1 умножить, 1 > сдвиг, и оди "в квадрат". > Да и быстрее особо не придумаешь - разве что у меня можно > n>>1 & 1 переделать в цикл по битам n - чтоб не > сдвигать. > Ну, ещё последнее умножение - лишнее. Но это, чтоб пример > не усложнять. > А чтоб код проще был - так проще for(i=0 ++i<n; > result*=a); как ни крути :) Согласен
Ты кстати в ACM Programming Contest не учавствовал?
[C++] Возведение в степень офигенных чисел27.11.01 20:53 Автор: Biasha <Бяша> Статус: Member
> Ты кстати в ACM Programming Contest не учавствовал? Я даже не знаю, что это такое :)
Подозреваю: соревнование. Единственное, в чём я участвовал по информатике - Киевская для школьников. Ужасная олимпиада, полный идиотизм. Участвовал только ради льгот при поступлении в вуз.
[C++] Возведение в степень офигенных чисел28.11.01 01:26 Автор: Korsh <Мельников Михаил> Статус: Elderman
> > Ты кстати в ACM Programming Contest не учавствовал? > Я даже не знаю, что это такое :) Правильно подозреваешь. Это мировая олимпиада по программированию среди студентов. месяц назад у нас(во Владивостоке) прошел четвертьфинал
по дальневосточному региону по северовосточной европе. Скоро полуфинал.
Получи и скомпиль на с++26.11.01 14:11 Автор: Pitbull Статус: Незарегистрированный пользователь