Быстрое возведение в степень - C (СИ)
Формулировка задачи:
дано . Пользуясь только умножением, выполнить:
- вычислить за две операции;
- вычислить и за пять операций
Решение задачи: «Быстрое возведение в степень»
textual
Листинг программы
#include <stdio.h>
unsigned foo( unsigned* res, unsigned x ) {
return ( *res *= x );
}
int main() {
unsigned a = 2, b = a;
fprintf(
stdout, "%u\n",
foo( &a, foo( &a, foo( &a, foo( &b, foo( &b, a ) ) ) ) )
);
return 0;
}
Объяснение кода листинга программы
В этом коде функция foo() быстро возводит в степень, используя для этого унарный оператор умножения (res = x). Однако, из-за того, что используется указатель на результат, который затем приводится к unsigned, происходит возведение в степень с плавающей точкой, что приводит к неопределенному поведению. Список действий:
- Включение заголовочного файла stdio.h.
- Определение функции foo() с двумя аргументами: указателем на результат и значением x.
- Возврат значения (res = x) из функции foo().
- Определение переменной a со значением 2.
- Определение переменной b со значением a.
- Вывод значения foo( &a, foo( &a, foo( &a, foo( &b, foo( &b, a ) ) ) ) в консоль.
- Возврат 0 из функции main(), чтобы указать, что программа успешно завершилась.