Как возвести в степень visual studio

Обновлено: 04.07.2024

Оператор остатка от деления – это оператор, который возвращает остаток после целочисленного деления. Например, 7/4 = 1 и остаток 3 . Следовательно, 7 % 4 = 3 . В качестве другого примера, 25/7 = 3 и остаток 4, таким образом, 25 % 7 = 4 . Оператор остатка от деления работает только с целочисленными операндами.

Этот оператор наиболее полезен для проверки того, делится ли одно число без остатка на другое число: если x % y принимает значение 0, то мы знаем, что x без остатка делится на y .

Вот результаты нескольких запусков этой программы:

Теперь давайте рассмотрим пример, в котором второе число больше первого:

Поначалу остаток от 2 может быть немного неочевидным, но это просто: 2/4 равно 0 (с использованием целочисленного деления), остаток 2. Когда второе число больше первого, второе число разделит первое число на 0 раз, поэтому первое число будет остатком.

Остаток от деления с отрицательными числами

Оператор остатка от деления также может работать с отрицательными операндами. x % y всегда возвращает результаты со знаком x .

Запускаем приведенную выше программу:

В обоих случаях вы можете видеть, что остаток принимает знак первого операнда.

Предупреждение

До C++11 оператор остатка от деления с отрицательным операндом мог давать как положительный, так и отрицательный результат. В C++11 это стало предсказуемым.

Где оператор возведения в степень?

Вы заметите, что оператор ^ (обычно используемый для обозначения возведения в степень в математике) – в C++ это побитовая операция XOR (исключающее ИЛИ) (описанная в уроке «O.3 – Битовые манипуляции с побитовыми операторами и битовыми масками»). В C++ нет оператора возведения в степень.

Обратите внимание, что параметры (и возвращаемое значение) функции pow() имеют тип double . Из-за ошибок округления в числах с плавающей запятой результаты pow() могут быть неточными (даже если вы передадите ей целочисленные значения или целые числа).

Если вы хотите выполнить целочисленное возведение в степень, лучше всего использовать для этого свою собственную функцию. Следующая функция реализует целочисленное возведение в степень (с использованием для повышения эффективности неинтуитивного алгоритма «возведения в возведения в квадрат»):

Не волнуйтесь, если вы не понимаете, как работает эта функция – чтобы вызывать ее, вам не нужно понимать ее внутреннюю работу.

Данная программа выводит следующее:

Предупреждение

В подавляющем большинстве случаев целочисленное возведение в степень приведет к переполнению целочисленного типа. Вероятно, именно поэтому такая функция не была включена в стандартную библиотеку.

Небольшой тест

Вопрос 1

Что будет результатом вычисления следующего выражения? 6 + 5 * 4 % 3

Поскольку * и % имеют более высокий приоритет, чем + , + будет вычисляться последним. Мы можем переписать наше выражение как 6 + (5 * 4 % 3) . Операторы * и % имеют одинаковый приоритет, поэтому мы должны учитывать ассоциативность для их вычисления. Ассоциативность для операторов * и % – слева направо, поэтому сначала мы вычисляем левый оператор. Мы можем переписать наше выражение так: 6 + ((5 * 4) % 3) .

6 + ((5 * 4) % 3) = 6 + (20 % 3) = 6 + 2 = 8

Вопрос 2

Напишите программу, которая просит пользователя ввести целое число и сообщает пользователю, четное это число или нечетное. Напишите функцию с именем isEven() , которая возвращает true (истину), если переданное ей целое число четное, и false (ложь) в противном случае. Чтобы проверить, является ли целочисленный параметр четным, используйте оператор остатка от деления.

Подсказка: в этой программе вам нужно будет использовать операторы if и оператор сравнения ( == ). Если вам нужно напомнить, как это сделать, смотрите урок «4.9 – Логические (булевы) значения».

Ваша программа должна давать следующий вывод:

Примечание: у вас может возникнуть соблазн написать функцию isEven() следующим образом:

Хотя это работает, но это сложнее, чем должно быть. Давайте посмотрим, как это можно упростить. Во-первых, давайте вытащим условное выражение if и присвоим его отдельному логическому значению:

Теперь обратите внимание, что оператор if выше, по сути, говорит: «Если isEvenNumber равно true , вернуть true , в противном случае, если isEvenNumber равно false , вернуть false ». Если это так, мы можем просто вернуть isEvenNumber :

И в этом случае, поскольку мы используем переменную isEvenNumber только один раз, мы могли бы также исключить и ее:

Здравствуйте, сегодня поговорим об алгоритме быстрого возведения в степень по модулю, а также реализуем этот алгоритм на C++ под Visual Studio.

Общая информация

Постановка задачи

А что если увеличить числа, например, 5 100 mod7, калькулятором не получится воспользоваться, так как не удастся вычислить 5 100 . Поэтому, можно воспользоваться алгоритмом быстрого возведения в степень.

Суть алгоритма

Чтобы вам было лучше понятно, суть алгоритма мы покажем на 2 примерах, надеюсь, после которых все будет понятно:

1 пример: 5 100 mod7
Напомню общий вид выражения: a x modp

Пойдем по шагам:

Шаг 1
Перевести степень числа из десятичной в двоичную систему исчисления.
10010 = 11001002

Шаг 2
Определить число элементов n, которое равно количеству всех цифр степени в двоичной системе.
У нас число 11001002 , n = 7 (всего цифр).

Дополнение к шагу 2
В общем виде, число n = [log2x] + 1 , [] скобки означают, что нужно взять целую часть от числа.
Для нашего примера n = [log2100] + 1 = 6 + 1 = 7.

В нашей задачи массив будет таким:
massive[0] = 5;
massive[1] = 25mod7 = 4;
massive[2] = 16mod7 = 2;
massive[3] = 4mod7 = 4;
massive[4] = 16mod7 = 2;
massive[5] = 4mod7 = 4;
massive[6] = 16mod7 = 2;

Шаг 4
Вычислить произведение элементов массива, которые возведены в соответствующие степени из двоичной записи числа на 1 шаге.
Нам нужно каждый элемент массива возвести в степень (либо в первую, либо в нулевую), затем перемножить, то что получилось. Самое важное, что возводить нужно по следующему правилу:
1 элемент массива возводится в степень последней цифры двоичного числа, 2 элемент массива возводится в степень предпоследней цифры двоичного числа и так далее.
В нашей задаче: 5 0 * 4 0 * 2 1 * 4 0 * 2 0 * 4 1 * 2 1 = 16

Шаг 5
Вычислить остаток от деления полученного произведения.
16mod7 = 2.
Это значит, что наша задача 5 100 mod7 = 2.

Теперь разберем второй пример, но уже коротко.

2 пример: 3 90 mod5

Шаг 1
9010 = 10110102

Шаг 2
n = 7

Шаг 3
massive[0] = 3;
massive[1] = 9mod5 = 4;
massive[2] = 16mod5 = 1;
massive[3] = 1mod5 = 1;
massive[4] = 1mod5 = 1;
massive[5] = 1mod5 = 1;
massive[6] = 1mod5 = 1;

Шаг 4
3 0 * 4 1 * 1 0 * 1 1 * 1 1 * 1 0 * 1 1 = 4

Шаг 5
4mod5 = 4
3 90 mod5 = 4

Реализация задачи на C++

Ну а теперь мы напишем алгоритм быстрого возведения в степень на языке C++ под Visual Studio.

Сначала объявляем переменные, необходимые для алгоритма, а затем осуществляем перевод из десятичной системы в двоичную и считываем в переменную n количество цифр в двоичной записи.

Сначала заполняем наш массив, вычисляя последовательно элементы. Затем вычисляем произведение и остаток от деления.

Читайте также: