Базовые формулы (зависимости) и задачи, решаемые с их помощью
Задачи из раздела "Теория чисел"
Необходимые дополнительные сведения для решения задач:
- Простое число - число, большее чем 1 и делящееся только лишь на 1 и на само себя.
- Совершенное число - число, равное сумме своих делителей (не считать делителем числа само число).
- Дружественные числа - пара чисел, каждое из которых равно сумме правильных делителей другого.
- Период строки - повторяющаяся часть строки
Ниже приведены задачи из раздела "Теория чисел" с разбором решений.
Задача: Проверить - простое ли число, введенное с клавиатуры.
input "введите число"; n rem=нахождение количества делителей============ for i=1 to n if n mod i=0 then k=k+1 next if k=2 then print "число простое" else print "число составное"
program pr;
var n,i,k: integer;
begin
writeln ('введите число');
readln (n);
k:=0;
{=нахождение количества делителей=}
for i:=1 to Round (n/2) do
if n mod i=0 then k:=k+1;
if k=2 then writeln ('число простое')
else writeln ('число составное');
end.Тест:
Задача: В диапазоне от А до В вывести все простые числа.
input "введите границы диапазона "; a, b print "простые числа:" for n=a to b k=0 for i=1 to n if n mod i=0 then k=k+1 next i if k=2 then print n next n
var a,b,n,i,k: integer;
begin
writeln ('введите границы диапазона');
readln (a,b);
writeln ('простые числа:');
for n:=a to b do
begin
k:=0;
{=нахождение количества делителей=}
for i:=1 to Round (Sqrt(n)) do
if n mod i=0 then k:=k+1;
if k=2 then
{
writeln (n);
writeln (' ');
}
end;
end.
Тест:
Задача: Проверить - совершенное ли число, введенное с клавиатуры.
input "введите число"; n
{========нахождение суммы делителей=================}
for i=1 to n/2
if n mod i=0 then s=s+i
next
if s=n then print "число совершенное" else print "число несовершенное"
var n,i,s: integer;
begin
writeln ('введите число');
readln (n);
s:=0;
{==нахождение суммы делителей==}
for i:=1 to (n div 2) do
if n mod i=0 then s:=s+i;
if s=n then writeln ('число совершенное')
else writeln ('число несовершенное');
end.
Тест:
Задача: На диапазоне от А до В вывести все совершенные числа.
input "введите границы диапазона "; a, b
print "простые числа:"
for n=a to b
s=0
rem=нахождение суммы делителей=
for i=1 to n/2
if n mod i=0 then s=s+i
next i
if s=n then print n
next n
var a,b,n,i,s: integer;
begin
writeln ('введите границы диапазона');
readln (a,b);
writeln ('совершенные числа:');
for n:=a to b do
begin
s:=0;
{==нахождение суммы делителей==}
for i:=1 to (n div 2) do
if n mod i=0 then s:=s+i;
if s=n then writeln (n);
end;
end.Тест:
Задача: Проверить, являются ли два числа, введенных с клавиатуры дружественными.
input "введите два числа"; n, m rem=========нахождение суммы делителей n================== for i=1 to n/2 if n mod i=0 then s1=s1+i next rem=========нахождение суммы делителей m================== for i=1 to m/2 if m mod i=0 then s2=s2+i next if (n=s2) and (m=s1) then print "дружественные" else print "не дружественные"
var n,m,i,s1,s2: integer;
begin
writeln ('введите два числа');
readln (n,m);
s1:=0;
s2:=0;
{=нахождение суммы делителей n=}
for i:=1 to (n div 2) do
if n mod i=0 then s1:=s1+i;
{=нахождение суммы делителей m=}
for i:=1 to (m div 2) do
if m mod i=0 then s2:=s2+i;
if (s2=n) and (s1=m) then writeln ('числа дружественные')
else writeln ('числа не дружественные');
end.Тест:
Задача: Ввести строку. Найти ее период.
Идея решения: Необходимо найти К (количество символов в строке), определить делители К и сравнить вырезки из строки по R символов (R-делитель К)
input "введите строку"; a$
n=len (a$)
for i=n to 1 step -1
k=1
if n mod i=0 then
rem=вырезка по i====================
for j=1 to n step i
if mid$ (a$, j, i)=mid$(a$,j+i,i) then k=k+1
next
if k=n/i then kol=i
end if
next
print mid$ (a$,1,kol)var n,i,j,k,x,h,period: integer;
a:string;
begin
writeln ('введите строку');
readln (a);
n:=length(a);
for i:=1 to n do
begin
k:=0;
if n mod i=0 then
begin
h:=n div i;
x:=1;
for j:=1 to i-1 do
begin
if copy (a,1,h)=copy(a,x+h,h) then k:=k+1;
x:=x+h;
end;
if k=i-1 then period:=h;
end;
end;
writeln (copy (a, 1, period));
end.Тест:
Краткие итоги лекции сформулированы в таблице 1.2:
| Бейсик | Паскаль | |
|---|---|---|
| Зависимость уменьшающейся переменной X в теле цикла от увеличивающегося значения счетчика цикла i |
for i=1 to n x=n-i+1 next |
for i:=1 to n do x:=n-i+1; |
| Признак кратности |
1. x \ y = x / y 2. x mod y =0 |
x mod y = 0 |
| Длина отрезка |
sqr ((x1-x2)^2+(y1-y2)^2) |
sqrt (sqr(x1-x2)+sqr(y1-y2)) |
Ключевые термины
- Счетчик цикла - переменная, в которой хранится номер шага выполнения тела цикла.
- Палиндром - запись, читaемая одинаково слева направо и справа налево.
- Кратность - делимость одного числа на другое без остатка. Арифметическая операция mod дает в результате остаток от деления двух чисел друг на друга.
- Гипотенуза прямоугольного треугольника - находится по теореме Пифагора как квадратный корень суммы квадратов катетов.
Набор для практики
Вопросы.
- Какова зависимость уменьшающейся переменной X в теле цикла от увеличивающегося значения счетчика цикла i, если счетчик работает от 0 до 10?
- Сформулируйте признак кратности числа Х числу У, признак четности числа. Как определить "круглое" ли число?
- Запишите арифметическое выражение, в котором вычисляется длина отрезка, если известны координаты его концов.
Упражнения из раздела "Графика на Паскале".
Задача: Написать программу для движения точки (или любого другого графического объекта) по четырем направлениям, показанным на рис. 1.3:
Задача: Написать программу для движения отрезка по экрану монитора. Отрезок "скользит" по горизонтальным краям окна в направлениях, показанных на рис. 1.4:

