Как найти степень числа в информатике

Текст решения задачи по программированию на PascalABC с комментариями. Что бы посмотреть объяснение этого решения нажмите смотреть видеоурок.

program stepen;
uses crt;
{ Записать программу возвед. числа, а в степень n }
var a, n, i, p: integer;
begin
write (‘n=’);readln (n); {Просим ввести степень числа и считываем её}
write (‘a=’);readln (a); {Просим ввести само число и считываем его}
p:=1; {Если степень равна 0 то цикл ни разу не выполнится и выведется число р, которое мы задаем равным единице, если же укажите при выполнении программы степень равную 1, то цикл выполнится 1 раз и число, а перемножится на р=1 после чего естественно получим само число а, что так же является правильным результатом}
for i:=1 to n do
p:=p*a; {В цикле на каждом кругу в переменную р, которую мы будем выводить в качестве конечного результата, заносится новое значение числа, а, возведенного в степень равную значению счетчика т. е. при i=1 р=а*1; при i=2 р=а*1*a (т.е. а в квадрате); при i=1 р=а*1*a*а (т.е. а в кубе); }
write (‘Число, а в степени n = ‘, p){Выводим результат};
readln;
end.

Раздел: Стандартные функции Паскаля

Основы программирования 2.0

Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать.
Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь.
Подробнее…

Функция Power в Паскале (и многих других языках программирования) выполняет возведение числа в степень.

Синтаксис для вещественных чисел:


function Power(Base: Double; Expon: Double) : Double;

Синтаксис для целых чисел:


function Power(Base: LongInt; Expon: LongInt) : LongInt;

Эта функция возводит число Base в степень Expon и возвращает результат. В реальности функция возвращает результат выражения:


Exp(Expon * Ln(Base))

ВАЖНО!

Всё, что сказано выше, взято из официальной документации
FreePascal. Однако документация иногда расходится с действительностью. Во всяком случае, мой компилятор не соответствует документации. А именно:

  • В документации сказано, что функция объявлена в модуле SYSTEM. Однако без подключения модуля MATH компилятор выдаёт ошибку. Из этого следует, что на самом деле функция объявлена в модуле MATH.
  • В документации приведён синтаксис как для целых, так и для вещественных чисел. Однако на самом деле функция работает только с вещественными числами. При попытке использовать целые числа компилятор также выдаёт ошибку.
  • Возможно, в более новых версиях эти проблемы уже исправлены. Но у меня было именно так (версия FPC 3.0.0).

Пример использования функции Power

Пример приведён ниже:

program funcpower;

uses Math;        

var x, y, z : single;

begin
  x := 2;
  y := 3;
  z := Power(x, y);   //Z = X в степени Y
  WriteLn(z:0:2);  

  ReadLn;
end.

Здесь мы число 2 (переменная Х) возводим в степень 3 (переменная Y), то есть вычисляем следующую формулу:


Z = XY

Обратите внимание на подключенный модуль MATH.

Эта статья входит в раздел о подпрограммах модуля SYSTEM. И по идее описания функции Power здесь не должно быть. Но, так как в документации сказано, что функция Power объявлена в модуле SYSTEM, я решил включить данную статью именно в этот раздел (я же не виноват, что в документации косяк))).

Возведение в степень в Паскале

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

Однако, если есть специальная функция для возведения числа в степень, то почему бы ей и не воспользоваться? С одной стороны. С другой стороны – эта функция совершенно неожиданно требует подключения модуля MATH.

В документации сказано, что по сути функция Power работает по формуле возведения в степень в Паскале:


Exp(Expon * Ln(Base))

Однако, если мы будем делать именно так, эта формула будет неправильно работать с
отрицательными числами, потому что в документации сказано, что функция Ln работает только с положительными числами.

Так что функция Power в реальности несколько сложнее, чем приведённая выше формула.

Поэтому для разминки мы напишем свой аналог функции Power, который будет работать правильно. Но для начала вспомним как вычисляется степень числа:

Возведение в степень

Также напомню, что любое число в нулевой степени равно 1, а ноль в любой степени равен 0 (кроме нуля в нулевой – ноль в нулевой степени не определён, но мы будем возвращать в таких случаях ноль, хотя функция Power возвращает 1).

А теперь наш аналог функции Power:

function AVPower(Base: Double; Expon: Double) : Double;
var m     : byte;
    i     : integer;
    Res   : Double;
begin
  m := 0;
  if Expon < 0 then m := 1              //Отрицательная степень
  else if Expon = 0 then m := 2         //Нулевая степень
       else m := 3;                     //Положительная степень
  if Base < 0 then m := 10 + m          //Отрицательное число
  else if Base = 0 then m := 20 + m     //Число равно 0
       else m := 30 + m;                //Положительное число
  case m of
  11  :   //Отрицательное число, отрицательная степень
    begin //Если Expon - не целое число, то получаются комплексные числа
      Res := 1 / Exp(Abs(Expon) * Ln(Abs(Base)));
      i := Round(Expon);
      if Odd(i) then Res := -1 * Res;
    end;
  12, 32  :   //Нулевая степень
    Res := 1;
  13  :   //Отрицательное число, положительная степень
    begin //Если Expon - не целое число, то получаются комплексные числа
      Res := Exp(Expon * Ln(Abs(Base)));
      i := Round(Expon);
      if Odd(i) then Res := -1 * Res;
    end;
  21..23  :   //Число равно нулю
    Res := 0;
  31  :       //Положительное число, отрицательная степень
    Res := 1 / Exp(Abs(Expon) * Ln(Base));
  33  :       //Положительное число, положительная степень
    Res := Exp(Expon * Ln(Base));
  end;     

  AVPower := Res;
end;

Я сознательно немного всё усложнил, чтобы вас запутать )))

Пример использования функций Power и её аналога в программе:

x := 2;
y := 3;
z := Power(x, y);     //Z = X в степени Y
WriteLn(z:0:2); 

z := AVPower(x, y);   //Z = X в степени Y
WriteLn(z:0:2);

Здесь есть один подвох – если вы попытаетесь возвести отрицательное число в не целую степень, например, так:

-23,5

то стандартная функция Power вызовет ошибку во время выполнения программы. В своём аналоге я этого избежал, но надо понимать, что результат в этом случае будет неправильным (хотя с моей точки зрения это всё-равно лучше, чем аварийное завершение программы).

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

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

Ещё в моей функции используется функция Odd, о которой я ещё не рассказывал. Вкратце скажу, что она определяет, является ли число чётным. Более подробно о ней расскажу в отдельной статье.

Как стать программистом 2.0

Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки…
Подробнее…

Помощь в технических вопросах

Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение – ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации.
Подробнее…

Программирование - это не сложно
Программирование – это не сложно

Добрый день, товарищи, даже если у вас уже вечер. Сегодня я хочу разобрать небольшую линейную задачку по нахождению степеней. Звучит наше сегодняшнее задание так: “Пользователь вводит число. Программа находит это число во второй, четвертой и восьмой степени.

А если вы не смотрели первую часть знакомства с линейными задачами (а именно так называется эта тема), то я оставлю ссылку на нее:

Решаем уравнение с помощью Pascal

1. Определимся с переменными

Так как задача подразумевает, что число вводит пользователь, то первая переменная – это число. Пусть эта переменная будет a. А дальше у нас есть два пути:

1. Присваивать переменной а новые значения и сразу выводить результат пользователю.

2. Создать свою переменную для каждой степени.

Давайте выберем первый вариант. Лишние переменные нам сейчас просто не нужны, да и в данном случае это является оптимизацией программы.

Степени с помощью программы на Pascal

Здесь мы определяем переменную а целым числом (integer), так как степень числа точно не будет дробью. Дальше программа начинается и приглашает пользователя ввести значение переменной.

2. Вычислим степени

Вот и вся простая программа
Вот и вся простая программа

Разбираем. Тут все легко.

  • Допустим пользователь задает а = 5.
  • Тогда мы умножаем 5 на 5 в первый раз и получаем 25.
  • ..И сразу присваиваем это значение нашей же переменной а.
  • Теперь а = 25. Это вторая степень 5. Снова умножаем а на а (25 на 25).
  • На этот раз а = 625. Это 5 в 4-й степени. Делаем умножение в третий раз.
  • а получается огромным числом 390625. Это соответствует 5 в 8-й степени.
  • задание выполнено.
Так выглядит вся программа
Так выглядит вся программа

На самом деле эта программа – очень полезная для дальнейших примеров.

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

И второй раз программу мы будем улучшать тогда, когда изучим процедуры и функции. Действие (a:=a*a;) нет смысла повторять столько раз подряд. Легче обернуть все это в компактную подпрограмму.

Вот такой вот простор для модификации. На сегодня на этом все!

Вот вам кота:

Это Кот
Это Кот

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

По возможности я попросил бы подписаться. Сейчас это критически важно для развития канала. Так то!

Доброго вам всем здоровьица в эти трудные времена!

На занятии изучается алгоритм работы с циклом с предусловием While в Паскале, рассматривается пример возведения в степень

Содержание:

  • While в Паскале — цикл с предусловием
    • Вложенные циклы в Паскале
  • Произведение в Паскале
  • Программа возведения в степень числа в Паскале

Пример: Определить количество цифр в введенном целом числе, не превышающем 2000000.

Алгоритм: Отделяем и удаляем последовательно последнюю цифру, наращивая счетчик.

n счетчик
246 0
24 1
2 2
0 3

В чем сложность?: Заранее не определено и неизвестно, сколько цифр нужно убрать, т.е. сколько шагов необходимо сделать.
Как выполнить: Надо перестать отделять цифры, когда n = 0, т.е. надо выполнять пока n > 0

Блок-схема решения:

Блок-схема решения цикл while

Блок-схема решения

Решение примера на Паскале:
пример цикла while Паскаль
Цикл while в Паскале применяется для создания повторений с неизвестным заранее их числом. Повторения (итерации) будут осуществляться, пока истинно некоторое условие.

Блок-схема, соответствующая циклу while в Паскале:
блок-схема while в паскале

while условие do {Пока условие истинно выполняется оператор}
   оператор;
  • Здесь оператор, стоящий после служебного слова do, образует тело цикла и будет выполняться, пока значение "условия" равно true (истина).
  • Если операторов должно быть несколько, тогда необходимо применять составной оператор.
  • Условие пересчитывается каждый раз при входе в цикл.
  • Непосредственно условием цикла while может быть переменная или логическое выражение.
  • Операторы тела цикла while выполнятся только в том случае, если условие будет истинно, если условие ложно — они игнорируются, и программа продолжается с тех операторов, которые стоят уже после конструкции. Таким образом, это существенное отличие цикла с предусловием от цикла с постусловием.

Рассмотрим использование цикла while в Паскале на решенном примере:

Пример: Печатать «ноль» указанное количество раз

Показать решение:

Pascal PascalABC.NET
1
2
3
4
5
6
7
8
9
10
var i,n:integer;
begin
write ('количество знаков');
readln(n);
i:=1;
while i<=n do begin {составной оператор}
  write(0);
  i:=i+1
end;
end.
1
2
3
4
5
6
7
8
begin
var n:=readInteger('количество знаков');
var i:=1;
while i<=n do begin {составной оператор}
  write(0);
  i:=i+1
end;
end.

Задача 3. Ввести целое число и найти сумму его цифр.
Пример:

Введите целое число:
1234
Сумма цифр числа 1234 равна 10.

  
[Название файла: L3task3.pas]

  • Можно использовать сложные условия:
  • сложные условия в while

    Задача 4. Вычислять с использованием цикла while квадратные корни из чисел 900, 893, 886, 879 и т.д. до тех пор, пока это можно делать.

      
    [Название файла: L3task4.pas]

    Детальный разбор работы цикла While в Паскале рассмотрен в видеоуроке:

    Пример: найти сумму всех элементов последовательности:

    найти сумму всех элементов последовательности
    которые по модулю больше 0,001:

    Алгоритм:

    Блок-схема решения:

    Блок-схема решения

    Блок-схема решения

    Решение на Паскале:

    Решение на Паскале

    Решение на Паскале

    Задача 5: Вычислить сумму элементов следующей последовательности с точностью 0,001:
    Найти сумму элементов последовательности с точностью 0,001

    Результат: S = 1.157

      
    [Название файла: L3task5.pas]

    Вложенные циклы в Паскале

    Существует возможность использования вложенных циклов в Паскале, когда в теле одного цикла вместо оператора стоит другой цикл.

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

    Рассмотрим пример:

    Пример: Вывести таблицу умножения, используя вложенные циклы в паскале.

    Показать решение:

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    const n = 9; {размер таблицы}
    var i, j :integer;
    begin
       for i:=1 to n do {номера строк}
       begin
         for j:=1 to n do {номера столбцов}
           write(i*j:4);
         writeln; {переход на новую строку}
       end;
    end.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    const n = 9; {размер таблицы}
    begin
       for var i:=1 to n do {номера строк}
       begin
         for var j:=1 to n do {номера столбцов}
           write(i*j:4);
         writeln; {переход на новую строку}
       end;
    end.

    Произведение в Паскале

    Точно также, как существует сумматор для сложения, для умножения в паскале тоже существует специальная конструкция:

    Произведение вычисляется по рекуррентному выражению:

    P=P*Y,

    где P – промежуточные произведения

    Y — сомножители

    Рассмотрим пример вычисления факториала числа в Паскале с использованием цикла while.

    Пример цикла While в Паскале для вычисления факториала 10! (10!=1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    var
      fact, n : integer;
    begin
      fact := 1; {начальное значение факториала =0! }
      n := 1;    {начальное значение для условия }
      while n<=10 do     {условие }
       begin             {начало тела конструкции с составным оператором }
         fact := fact*n; {вычисление факториала n! }
         n := n + 1       {n должно меняться в теле конструкции}
       end;                {конец тела цикла }
      writeln(10!=,fact);  {вывод результата расчета }
    end.

    Здесь необходимо обратить внимание на то, что присваивание n := 1 стоит до цикла, если этого не сделать, то условие будет работать некорректно, так как переменная n будет пуста.

    Программа возведения в степень числа в Паскале

    Для начала уточним, что есть формула вычисления степени на Паскале. Но мы не будем ее использовать, а разберем алгоритм решения задачи возведения в степень.

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

    Таким образом, возведение числа n в степень d можно выразить так:
    nd = n1 * n2 * n3 * … * nd, где нижние индексы просто указывают очередное по счету число n.

    Еще необходимо учесть следующее:

    • число в нулевой степени равняется 1
    • если показатель степени отрицателен, т.е. d < 0, то задача решается по формуле:
      nd = 1 / (n1 * n2 * n3 * … * nd)

    Т.е., решая программу на Паскале, учитываем:

    • в программе на языке Паскаль количество итераций (повторений) цикла while должно быть равно показателю степени числа по модулю;
    • если показатель степени — отрицательное число, то нужно впоследствии единицу разделить на результат.

    Задача 6. Вычислить в Паскале степень числа, используя цикл while.

      
    [Название файла: L3task6.pas]

    Задача 7. Дана последовательность вещественных чисел, признак завершения которой — число 0 (оно не считается элементом последовательности). Найти сумму всех положительных элементов этой последовательности.

    Пример результата:

    Введите член последовательности
    4
    Введите член последовательности
    -1
    Введите член последовательности
    5
    Введите член последовательности
    7
    Введите член последовательности
    0
    Сумма положительных чисел = 16

      
    [Название файла: L3task7.pas]

    как записать в паскале степень.

    Андрей Павлов



    Ученик

    (97),
    закрыт



    10 лет назад

    Сафин Станислав

    Профи

    (873)


    12 лет назад

    В паскале есть возведение в квадрат y:=sqr(x); и возведение любого положительного числа в любую степень y:=exp(ln(x)*n); где x,n-любые целые или вещественные числа, x>0. y – вещественное число. Для всех других случаев нужно придумывать свои функции.

    Добавить комментарий