Россия, Москва, МИЭМ |
Базовые формулы (зависимости) и задачи, решаемые с их помощью
Задачи из раздела "Теория чисел"
Необходимые дополнительные сведения для решения задач:
- Простое число - число, большее чем 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: