Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3017_1.doc
Скачиваний:
9
Добавлен:
16.05.2015
Размер:
467.97 Кб
Скачать

Розглянемо декілька прикладів:

Дано натуральне числоS. Вимагається написати програму для знаходження всіх прямокутників, площа яких рівна S і сторони виражені натуральними числами.

program zadacha3_6;

var s, а, b:longint;

Begin

writeln('Введіть s'); readln(s);

for а:=1 to s do

for b:=1 to s do

if a*b=s then writeln ('сторони ',a,' і ',b);

End.

Дану задачу можна було вирішити, використовуючи тільки один цикл. Подумайте, як це зробити.

Дані натуральні числаn, m. Отримати всі натуральні числа, менші n, сума квадратів цифр яких рівна m.

program zadacha3_7;

var n, m, i, а, sum, cif:longint;

Begin

writeln('введіть n і m');readln(n, m);

for i:=1 to n do

begin

а:=i;sum:=0;

while a>0 do

begin

cif:=a mod 10;

sum:=sum+sqr(cif);

а:=a div 10;

end;

if sum=m then write(i,' ');

end;

End.

Знайти всі рішення заданого числового ребусу. Кожній букві відповідає деяка цифра. Причому однаковим буквам відповідають однакові цифри, різним буквам - різні цифри.

Оскільки тут всього три букви, то для вирішення достатньо написати три вкладені цикли, і перебрати всі варіанти складання тризначних чисел.

program zadacha3_8a;

var до, t, про, kto, kot, tok:longint;

Begin

for до:=0 to 9 do

for t:=0 to 9 do

for про:=0 to 9 do

begin

kto:=k*100+t*10+o;

kot:=k*100+o*10+t;

tok:=t*100+o*10+k;

if (k<>t) and (k<>o) and (t<>o) and (kto+kot=tok) then

writeln(kto,'+',kot,'=',tok);

end;

End.

В даному алгоритмі тіло циклу виконувалося 10•10•10=1000 разів. (говоритимемо складність алгоритму =1000)

Якщо ж для вирішення складніших ребусів буде потрібно написати 8-10 вкладених циклів, то такий повний перебір працюватиме достатньо довго.

Можна трохи спростити даний алгоритм, якщо побачити що 1?k?4, t?2.

for до:=1 to 4 do

for t:=2 to 9 do

for про:=0 to 9 do

Тепер складність алгоритму 4•8•10=320. Просте косметичне виправлення дало збільшення швидкості в 3 рази.

Але і даний алгоритм не є оптимальним. Подивіться, при k=2 і t=2 програма перебере всі 10 варіантів про. В таких випадках коли k=t цикл по про взагалі необхідно не виконувати.

Назвемо такий метод - контрольований перебір.

program zadacha3_8c;

var до, t, про, kto, kot, tok:longint;

Begin

for до:=1 to 4 do

for t:=2 to 9 do

if k<>t then

for про:=0 to 9 do

if (k<>o) and (t<>o) then

begin

kto:=k*100+t*10+o;

kot:=k*100+o*10+t;

tok:=t*100+o*10+k;

if kto+kot=tok then writeln(kto,'+',kot,'=',tok);

end;

End.

Такий алгоритм навіть при 8-10 вкладених циклах працює дуже швидко.

Питання для повторення:

  1. Чи може у вкладених циклах використовуватися одна і та ж змінна, наприклад i?

  2. Чи можна вкладати один в одного різні цикли: FOR в WHILE або REPEAT в FOR?

Завдання для самостійної роботи:

  1. Старовинна задача. Скільки можна купити биків, корів і телят, якщо бик коштує 10 рублів, корова – 5 рублів, теля – полтінік (0,5 рублі), за умови, що на 100 рублів треба купити 100 голів худоби.

  2. Задане натуральне n. Для всіх чисел від 1 до n знайти:

  1. кількість дільників; b) суму парних дільників.

  1. Знайти всі рішення наступних числових ребусів:

  1. БАБКА+ДЕДКА+РЕПКА=СКАЗКА (4 рішення)

  2. КОРОВА+ТРАВА+ДОЯРКА=МОЛОКО (2 рішення)

  3. АЛЕНКА+ИВАН+КОЗЛИК=СКАЗКА (1 рішення)

  4. ВЕТКА+ВЕТКА+СТВОЛ=ДЕРЕВО (3 рішення)

  5. ВОРОТА+ТРАВА=ФУТБОЛ (3 рішення)

Вивчаємо “Цикли”

Тема уроку:

Алгоритми з повтореннями.

Практикум по розв’язуванню задач

з повтореннями.

Мета заняття:

  1. Закріпити навики написання алгоритмів з повтореннями;

  2. Здійснити проміжний контроль знань;

  3. Вдосконалення уміння будувати програми мовою Паскаль. Виховувати уважність, активність на уроці.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]