11

Как записать (-1)^(k+1) без использования функции pow?

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
  • Резонный вопрос, а зачем? – Kromster Dec 18 '15 at 05:49
  • Можно циклом, но оно вам надо? – user453575457 Dec 18 '15 at 05:51
  • 2
    Да, на лабе сказали оптимизировать код, тоесть без pow, но не знаю как – Dzianis Papchanka Dec 18 '15 at 05:53
  • Ниже ответ условным оператором - оптимальней по времени, но строк больше :) – user453575457 Dec 18 '15 at 05:56
  • k только целого типа и больше -1? – Sergey Dec 18 '15 at 07:53
  • @banme Вопрос очень хороший, но думаю тут все в порядке. Если бы тут подразумевались не только натуральные числа и 0, то от pow() было бы не отказаться или даже pow() вообще не подходил бы. – tutankhamun Dec 18 '15 at 07:56
  • @tutankhamun если степень можно представить в виде n/m (т.е. в виде обыкновенной дроби) и m - нечетное, то без pow можно обойтись. – αλεχολυτ Mar 16 '16 at 10:01
  • @alexolut напишите альтернативный ответ. Топикстартер-то не я – tutankhamun Mar 16 '16 at 11:04
  • @tutankhamun так я не на вопрос как таковой комментарий писал, а на Ваш комментарий отвечал. – αλεχολυτ Mar 16 '16 at 11:11
  • @alexolut На самом деле без pow() получится обойтись всегда, поскольку для целых чисел есть простые и достойные замены, а возведение -1 в степень, являющуюся нецелым двоичным числом с ограниченной точностью даст комплексное значение, поскольку такое число представить в виде дроби с нечетным знаменателем не получится – tutankhamun Mar 16 '16 at 13:57

6 Answers6

23
int result;

if (k%2 == 0)
    result = 1;
else 
    result = -1;
Cerbo
  • 6,863
10

Мне понравился ответ @Mira и @tutankhamun

Но если используете это выражение в цикле есть еще более оптимальный

c = -c;

К примеру

c = -1;
for(int k=0; k<n;k++){
  // дествие с значение (-1)^(k+1) исползуете пересенное _c_
  c = -c; // меняем значение _c_
}
Saidolim
  • 8,341
  • 4
  • 26
  • 48
  • 2
    А за что минус? Ответ по сути верный. – VladD Dec 19 '15 at 09:44
  • @VladD спасибо. Да , мне тоже интересно зачем ? – Saidolim Dec 19 '15 at 09:48
  • Не минусовал, но зачем цикл, если знак результата напрямую зависит от модуля степени по двойке? – Kromster Mar 16 '16 at 09:32
  • 1
    @KromStern про цикл сказано в контексте того, что он уже есть и нужно получить значение для (-1)^(k+1) в процессе прохода по циклу. – αλεχολυτ Mar 16 '16 at 10:07
9

Можно так:

(k & 0x01) ? 1 : -1

или так:

((k & 0x01) << 1) - 1
tutankhamun
  • 11,366
8

В зависимости от четности степени это будет выглядеть как:

if (k%2 == 0) ...
Denis
  • 8,910
  • 11
  • 31
  • 55
dzrkot
  • 405
5

Вот еще вариант, для тех кто понимает, без условных операторов:

1 - 2 * (k % 2)
Cerbo
  • 6,863
  • 1
    Имхо самый лучший, это как раз без ветвления, например в glsl это сильно предпочтительнее – Stranger in the Q Jun 26 '19 at 09:01
  • я не знаток с++, а разве так 1 - k % 2 * 2 нельзя? – Stranger in the Q Jun 26 '19 at 09:04
  • 1
    Можно и так конечно, скобки для того чтобы не вспоминать приоритеты. Я однажды ошибся в приоритете тернарного обператора и запятой и жестоко за это поплатился жестким, противоестественным, ночным сексом с отладчиком. – Cerbo Jun 26 '19 at 14:46
2

Объединение ответов @Mira и @tutankhamun в один:

k % 2 ? 1 : -1;
αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119