1. Напишите программы для решения следующих задач.

1. Определите последнюю цифру натурального числа N.

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

var n: integer;
begin
write('Введите натуральное число:'); // тру-ля-ля
readln(n);
while n >= 10 do
begin
  n := n mod 10
end;
writeln(n);
end.

2. Два отрезка на плоскости задаются координатами своих концов. Определите, какой из них короче.

Сначала найдём длины отрезков с помощью формулы из геометрии √(X²+Y²) = √ ((X2-X1)²+(Y2-Y1)²). Затем сравним полученные длины. Напомним, sqrt находит корень числа, а sqr — его квадрат.

var x1, x2, y1, y2: integer; l1, l2: real;
begin
writeln('Введите через Enter координаты x1, y1, x2, y2 для 1-го отрезка:');
readln(x1);
readln(y1);
readln(x2);
readln(y2);
l1 := sqrt(sqr(x2-x1)+sqr(y2-y1));
writeln('Введите через Enter координаты x1, y1, x2, y2 для 2-го отрезка:');
readln(x1);
readln(y1);
readln(x2);
readln(y2);
l2 := sqrt(sqr(x2-x1)+sqr(y2-y1));
if l1 < l2 then
  writeln('Первый отрезок короче')
else
  if l2 < l1 then
writeln('Второй отрезок короче')
  else
writeln('Отрезки равны');
end.

3. Найдите сумму для заданного N.

Воспользуемся циклом for и пройдёмся от 0 до n, прибавляя к s результат деления единицы на квадрат числа i.

var n: integer; s: real;
begin
s := 0;
write('Введите число n:');
readln(n);
for var i := 1 to n do
s := s + 1/sqr(i);
writeln('Сумма: ', s);
end.

4. Вводится строка текста. Определите, является ли она палиндромом.

Палиндромом — это слово или фраза, которая читается одинаково в обоих направлениях, например, «шалаш» или же «а роза упала на лапу Азора».

Сперва приведём нашу строку s к нижнему регистру с помощью функции LowerCase для того, чтобы такие слова как «Анна» также считались палиндромами. Затем с помощью цикла while удалим все пробелы в строке, чтобы строка «а роза упала на лапу Азора» тоже считалась палиндромом, ведь при чтении пробелы не учитываются. Цикл работает до тех пор, пока в строке не останется ни одного пробела. Существование пробела мы узнаём с помощью функции pos(' ', s). Далее в цикле for проходимся по первой половине строки и сравниваем каждую букву с буквой с зеркальной позицей с конца строки. Если находим хоть одно несовпадение, присваиваем переменной p значение false, что будет означать, что слово не является палиндромом.

var n: integer; s: string; p: boolean;
begin
  writeln('Введите текст:');
  readln(s);
  s := LowerCase(s);
  while (pos(' ', s) <> 0) do
    delete(s, pos(' ', s), 1);
  writeln(s);
  n := length(s);
  p := true;
  for var i := 1 to n div 2 do
  if s[i] <> s[n-i + 1] then
  p := false;
  if p = true then
    writeln('Строка является палиндромом')
  else
    writeln('Строка не является палиндромом');
end.

5. Вводятся два целых числа, являющихся числителем и знаменателем дроби. Сократите дробь, выведите полученные числитель и знаменатель. П о д с к а з к а: можно воспользоваться алгоритмом Евклида.

Для сокращения дроби нужно найти НОД (наибольший общий делитель) числителя и знаменателя. Для нахождения НОД воспользуемся алгоритмом Евклида, который заключается в нахождении последнего, неравному нулю остатку от деления. Делить будем большее число на меньшее, поэтому сперва определим минимальное и максимальное число и запишем эти значения с переменные min и max соответственно. Щатем в цикле while будем находить остаток от деления двух чисел до тех пор, пока переменная min не станет равна нулю. Наконец, сократим наши числитель и знаменатель на найденный НОД.

var n, m, min, max, p, nod: integer;
begin
  writeln('Введите числитель и знаменатель:');
  readln(n);
  readln(m);
  if n > m then
  begin
    max := n;
    min := m;
  end
  else
    if m > n then
    begin
      max := m;
      min := n;
    end;
  while min <> 0 do
begin
    p := min;
    min := max mod min;
    max := p;
end;
  nod := max;
  writeln('Сокращённая дробь: ', n/nod, '/', m/nod);
end.

6*. Дед Мазай и заяц играют в очень простую игру. Перед ними — гора из N одинаковых морковок. Каждый из игроков во время своего хода может взять из нее любое количество морковок, равное неотрицательной степени числа 2 (1, 2, 4, 8, …). Игроки ходят по очереди. Кто возьмет последнюю морковку, тот и выигрывает. Составьте алгоритм, который при заданном значении N определяет победителя в этой игре. Учтите, что каждый из игроков хочет выиграть и не делает лишних ходов, т. е. играет оптимально.

Воспользуемся двумя циклами while. Первый цикл будет использован в качестве «ходов» игроков, и этот цикл не останавливается, пока морковок n не останется совсем. Второй цикл будет вложенным, с помощью него мы будем подбирать максимальное количество морковок, которое может забрать игрок, учитывая то, что количество морковок должно быть равно степени числа 2. Таким образом, мы находим максимальную степень для числа 2 так, чтобы 2 в этой степени была меньше или равна n (ведь мы не можем забрать больше морковок, чем лежит в горе). При начале каждого «хода» будем увеличивать переменную step на единицу — так мы узнаем, на каком ходу марковок больше не осталось, и определим победителя по чётности/нечётности номера хода.

var n, i: real; step: integer;
begin
  write('Введите количество морковок N: ');
  readln(n);
  step := 0;
  while n <> 0 do
  begin
    step := step + 1;
    i := 0;
    while Power(2,i) <= n do
      i := i + 1;
    i:= i - 1;
    writeln(n, '-', Power(2,i), ' (2 в степени ', i, ')');
    n := n - Power(2,i);
  end;
  writeln('Осталось морковок: ', n);
  if step mod 2 = 0 then
    writeln('Победил игрок, который ходил вторым')
  else
    writeln('Победил игрок, который ходил первым');
end.