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.