Опубликован: 21.03.2012 | Доступ: свободный | Студентов: 2949 / 224 | Оценка: 4.44 / 4.19 | Длительность: 06:43:00
Специальности: Программист
Лекция 2:

Базовые формулы (зависимости) и задачи, решаемые с их помощью

< Лекция 1 || Лекция 2: 12 || Лекция 3 >

Задачи из раздела "Теория чисел"

Необходимые дополнительные сведения для решения задач:

  • Простое число - число, большее чем 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.

Тест:

Дано: 8 11
Результат: Число составное Число простое

Задача: В диапазоне от А до В вывести все простые числа.

Программа на Бейсике:

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.

Тест:

Дано: 10, 100
Результат: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Задача: Проверить - совершенное ли число, введенное с клавиатуры.

Программа на Бейсике:

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.

Тест:

Дано: 6
Результат: Число совершенное

Задача: На диапазоне от А до В вывести все совершенные числа.

Программа на Бейсике:

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.

Тест:

Дано: 0,100
Результат:

6

28

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

Программа на Бейсике:

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.

Тест:

Дано: 220, 284
Результат: Числа дружественные

Задача: Ввести строку. Найти ее период.

Идея решения: Необходимо найти К (количество символов в строке), определить делители К и сравнить вырезки из строки по 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:

Таблица 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 дает в результате остаток от деления двух чисел друг на друга.
  • Гипотенуза прямоугольного треугольника - находится по теореме Пифагора как квадратный корень суммы квадратов катетов.

Набор для практики

Вопросы.

  1. Какова зависимость уменьшающейся переменной X в теле цикла от увеличивающегося значения счетчика цикла i, если счетчик работает от 0 до 10?
  2. Сформулируйте признак кратности числа Х числу У, признак четности числа. Как определить "круглое" ли число?
  3. Запишите арифметическое выражение, в котором вычисляется длина отрезка, если известны координаты его концов.

Упражнения из раздела "Графика на Паскале".

Задача: Написать программу для движения точки (или любого другого графического объекта) по четырем направлениям, показанным на рис. 1.3:

Траектория движения точки

Рис. 1.3. Траектория движения точки

Задача: Написать программу для движения отрезка по экрану монитора. Отрезок "скользит" по горизонтальным краям окна в направлениях, показанных на рис. 1.4:

Траектория движения отрезка

Рис. 1.4. Траектория движения отрезка
< Лекция 1 || Лекция 2: 12 || Лекция 3 >