Возведении целого числа в неотрицательную степень

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

(Из книги А. Шеня "Программирование: теоремы и задачи".) Дано целое число а и целое неотрицательное число n. Вычислить а в степени n. Другими словами, необходимо составить программу, при исполнении которой значения переменных а и n не меняются, а значение некоторой другой переменной (например, b) становится равным а в степени n. (При этом разрешается использовать и другие переменные.) Требуется, чтобы число действий (выполняемых операторов присваивания) было порядка log2 n (то есть не превосходило бы C * log2 n для некоторой константы C; log2 n — это степень, в которую нужно возвести 2, чтобы получить n).

Решение.

k := n; b := 1; c := a;

{a в степени n = b * (c в степени k)}

while k <> 0 do

begin

if k mod 2 = 0

then begin

k := k div 2;

c := c * c

end

else begin

k := k - 1;

b := b * c

end

end;

Каждый второй раз (не реже) будет выполняться первый вариант оператора выбора (если k нечетно, то после вычитания единицы становится четным), так что за два цикла величина k уменьшается по крайней мере вдвое.

Задача на нахождение наибольшего числа из трех

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

НЕ нашли? Не то? Что вы ищете?

Решение. Задача и по своей сути и по способу реализации простейшая, но даже при решении такой простой задачи есть свои нюансы. Дело в том, что получить желаемый результат можно несколькими способами. При выполнении такой простейшей задачи подойдет любой вариант.  Но как показала практика,  при усложнении задачи, когда требуется найти наибольшее из четырех чисел, у неподготовленных  учеников возникают ошибки. Предлагаю вариант решения, используя который ученики допускают наименьшее количество ошибок. Он сводится к следующему: после операции  сравнения наибольшее значение присваивается какой - либо  одной переменной (например "х"), которая и будет выведена в качестве результата решения задачи.

var

  x, y,z :integer;

begin

  writeln('Введите три целых числа');

  readln(x, y,z);

  if x < y then

  x:=y;

  if x < z then

  x := z;

  writeln('Наибольшее целое число = ',x);

  readln;

end.

Задания связанные с обработкой строки

Задача №1. Написать программу, которая будет подсчитывать количество символов в введенной строке.

Решение.

var 

  str: string;

begin

  writeln('Введите строку');

  readln(str);

  writeln('Количество символов = ', length(str));

  readln;

end.

Задача №2. Модернизировать предыдущую программу таким образом, чтобы дополнительно узнать сколько пробелов было в введенной строке.

Решение.

var 

  str: string;

  i, x integer;

begin

  writeln('Введите строку');

  readln(str);

  for i:= 1 to length(str) do

  if str[i] = ' ' then

  x:=x+1;

  writeln('Количество символов = ', length(str));

  writeln('Количество пробелов = ', x);

  readln;

end.

Задача №3.  Измените предыдущую программу таким образом, чтобы кроме подсчета символов она заменяла все пробелы буквой "s" и выводила на экран итоговый результат.

Решение.

var 

  str: string;

  i, x integer;

begin

  writeln('Введите строку');

  readln(str);

  for i:= 1 to length(str) do

  if str[i] = ' ' then

  str[i] := 's';

  writeln('Количество символов = ', length(str));

  writeln(str);

  readln;

end.

Задача №4. Напишите программу, которая будет удалять пробелы из строки, а результат выводить на экран.

Решение.

var

  str:string;

  i:integer;

begin

  writeln('Введите строку');

  readln(str);

  for i:=1 to length(str) do

  if str[i]=' ' then

  begin

  delete(str, i,1);

  i:=i-1;

  end;

  writeln('Итоговая строка - ', str);

  readln;

end.

Задача №5. Напишите программу, которая читает с клавиатуры строку текста и выводит ее на экране "задом на перед". 

Решение.

var

  str: string;

  i: integer;

begin

  write('Введите строку символов');

  readln(str);

  for i:= length(str) downto 1 do

  write(str[i]);

  readln;

end.

Нахождение наибольшего числа

Задача №1.Найти наибольшее целое число из четырех введенных с клавиатуры (5 баллов).

var

x, y,z, w:integer;

begin

writeln('Введите четыре целых числа');

readln(x, y,z, w);

if x < y then

  x := y;

if x < z then

  x := z;

if x < w then

  x := w;

writeln('Максимальное число =  ', x);

readln;

end.

Разные задачи

Задача №1. Написать программу, которая будет менять местами два введенных с клавиатуры слова. Слова разделены пробелом (10 баллов).

Тест. Введено «Иван Петров», результат «Петров Иван».

var

  str, str2:string;

  i:integer;

begin

  writeln('Введите строку символов');

  readln(str);

  for i := 1 to length(str) do

  if str[i] = ' ' then

  begin

  str2 := copy(str,1,i-1);

  delete(str,1,i);

  end;

writeln('Итоговая строка - ',str + ' '+ str2); readln;

end.

Задача №2. Подсчитайте, сколько слов во введенном предложении начинается с буквы «w» (15 баллов).

var

  str:string;

 x, i:integer;

begin

  writeln('Введите предложение');

  readln(str);

  for i:=1 to length(str) do

  if str[i]=' ' then

  if str[i+1]= 'w' then

  x:=x+1;

 end;

  if str[1]='w' then

  x:=x+1;

  writeln(‘Количество слов в предложении  начинающихся буквой «w»  =  ‘ , x);

  readln;

end.

Задача №3. Построить семейство концентрических окружностей, удовлетворяющих следующим условиям:

1.  Центр окружностей расположен в точке с координатами (315, 125);

2.  Радиус исходной окружности равен 50 единицам;

3.  Радиус каждой следующей окружности меньше предыдущей на 5 единиц;

4.  Радиус последней построенной окружности не должен быть меньше 5 единиц;

Решение.

uses

  graph;

var

  x, gd, gm:integer;

begin

  gd:=detect;

  initgraph(gd, gm,'');

  x:=50;

  while x>4 to

  begin

  circle(315,125,x);

  x:=x-5;

  end;

readln;

end.