четвер, 11 січня 2018 р.

Алгоритми з вкладеними циклами

Задачі з вкладеними циклами

Будь-який складний алгоритм завжди складається з декількох простих алгоритмів. Потрібно навчитись їх бачити та комбінувати.

Приклад 1

Знайти 10 перших простих чисел.
В цій задачі використовуються такі алгоритми:
  • Пошук декількох чисел (10), що задовольняють деякій умові (в нашій задачі: чи є число простим?);
  • Визначення, чи є число простим?
Зрозуміло, що другий алгоритм вкладений у першій.

Змінні:

Вхідних даних немає.

Вихідні:
  • n – шукані числа (цілого типу)
Проміжні:
  • k – лічильник шуканих чисел (цілого типу)
  • p – ознака наявності дільників (логічного типу, p=false - немає дільників, p=true - є дільники)
  • i – дільники та параметр циклу (цілого типу)

Алгоритм

  1. Якщо згадати перший алгоритм, то у ньому:
    • до циклу присвоюються початкові значення числу n та кількості чисел k;
    • у тілі циклу repeat:
      • збільшується значення числа n;
      • число n перевіряється на якусь умову: якщо умова вірна, то число друкується та збільшується лічильник таких чисел k.
    • перевіряється умова завершення циклу: чи надрукована потрібна кількість таких чисел?
      • Якщо так, то цикл завершується і кінець програми.
      • Якщо ні, то перехід на початок тіла циклу.
  2. Зрозуміло, що цей алгоритм буде зовнішнім циклом у нашій програмі, і перебір та перевірку чисел потрібно починати з числа 1.
  3. Умова, на яку у цьому циклі перевіряється число n, – чи є це число простим? Алгоритм, який це визначає, буде вкладений в перший.
  4. Згадаємо, що число n називається простим, якщо в нього немає дільників в інтервалі [2, n div 2].
  5. Тепер згадаємо другий алгоритм, який перевіряє, чи просте число n:
    • До циклу присвоюємо початкове значення ознаці p:=false. Тобто вважаємо, що дільників у числа n немає.
    • У циклі for i:=2 to n div 2 do будемо шукати дільники числа n. Для кожного будемо перевіряти умову n mod i=0 і, якщо вона вірна (тобто i є дільником n), то встановимо значення ознаки p:=true.
    • Коли цикл закінчиться, то перевіримо значення ознаки:
      • якщо p=false, то дільників немає, число n - просте.
      • якщо p=true, то є дільники, число - не просте.
  6. Другий алгоритм вкладений у перший перед перевіркою числа n (виділено жирним).

Блок–схема програми

Програма

 Var n,k,i:word; p:boolean;
Begin
 n:=1; k:=0;
 repeat
   n:=n+1;
   p:=false;
   for i:=2 to n div 2 do
      if n mod i=0 then p:=true;

   if not p then
    begin
      write(n,' '); k:=k+1;
    end;
 until k=10;
end.

Результат роботи програми

Відповідь
2 3 5 7 11 13 17 19 23 29

Приклад 2

Дано натуральне число n. Знайдіть його цифровий корінь (від слова цифра, не плутати з коренем квадратним!)

Визначення

Цифровий корінь числа n - це цифра (1, 2, 3,...9), яка обчислюється з цифр числа n за таким алгоритмом:
  1. Знайдемо у числі n суму цифр s.
  2. Перевіримо цю суму s:
    • Якщо вона є цифрою (1, 2, 3,...9), то ця сума є цифровий корінь числа n
    • Якщо вона не є цифрою (>9), то візьмемо замість числа отриману суму цифр s та повторимо алгоритм з пункту 1.

Результат роботи програми

ВвідВивід
34569
5556

Змінні:

Вхідні:
  • n – натуральне число (цілого типу)
Вихідні:
  • сn – цифровий корінь числа n (цілого типу)
Проміжні:
  • c – остання цифра числа n (цілого типу)
  • s – сума цифр числа n (цілого типу)

Алгоритм

  1. В цій задачі використовуються такі алгоритми:
    • знаходження суми цифр числа;
    • заміна числа сумою його цифр, поки ця сума >9.
  2. Зрозуміло, що першій алгоритм вкладений у другий.
  3. Згадаємо алгоритм знаходження суми цифр числа n: обчислюємо останню цифру числа, додаємо її до суми і відкидаємо останню цифру від числа. Все це робимо, поки не переберемо всі цифри числа (у програмі виділено жирним).
  4. У другому алгоритмі:
    • Після знаходження суми цифр числа, замінимо число сумою його цифр (n:=s).
    • Перевіримо цю суму s:
      • Якщо вона є цифрою (s<=9), то цикл завершується. Виконується перехід на перший оператор після циклу (пункт 5).
      • Якщо вона не є цифрою (s>9), повторимо алгоритм з пункту 3.
  5. Значення отриманої суми присвоюється змінній cn та виводиться на екран.

Програма

 var n:longint; c,s,cn:byte;
begin
 read(n);
 repeat
   s:=0;
   repeat
      c:= n mod 10;
      s:=s+c;
      n:=n div 10;
   until n=0;

   n:=s;
 until s<=9;
 cn:=s;
 writeln(cn);
end.

Приклад 3

Знайдіть цифрові корені всіх простих чисел з інтервалу [100, 200]. Надрукувати число та відповідний цифровий корінь.

Результат роботи програми

Відповідь
101 2 103 4 107 8 109 1 113 5 127 1 131 5 137 2 139 4 149 5 151 7 157 4 163 1 167 5 173 2 179 8 181 1 191 2 193 4 197 8 199 1

Змінні:

Вхідних даних немає.

Вихідні:
  • n – просте число (цілого типу)
  • сn – цифровий корінь числа n (цілого типу)
Проміжні:
  • i – дільники числа n та параметр циклу (цілого типу)
  • p – ознака простого числа (логічного типу, p=false - просте, p=true - ні)
  • m – копія числа n (цілого типу)
  • c – остання цифра числа n (цілого типу)
  • s – сума цифр числа (цілого типу)

Алгоритм

  1. В цій задачі використовуються такі алгоритми:
    • перебір всіх чисел з інтервалу [100, 200];
    • для кожного з цих чисел визначення, чи є воно простим;
    • знаходження цифрового кореню кожного простого числа. Цей алгоритм в свою чергу складається з двох алгоритмів (дивись приклад 2).
  2. Зрозуміло, що першій алгоритм - це зовнішній цикл for з параметром n. Він перебирає числа в інтервалі [100, 200].
  3. Другий алгоритм - це пошук дільників для кожного числа n. Це теж цикл for з параметром i (у програмі виділено жирним). Цей цикл вкладений у перший.
  4. Якщо число просте, тобто дільників у числі немає (p=false), то виконується третій алгоритм, обчислення цифрового кореню числа n (у програмі виділено жирним). Цей алгоритм змінює число n, яке є параметром циклу і не може змінюватись, тому робимо копію цього числа у змінній m та застосовуємо цей алгоритм для змінної m.

Програма

 var n,m,i:longint; c,s,cn:byte; p:boolean;
begin
 for n:=100 to 200 do
 begin
   p:=false;
   for i:=2 to n div 2 do
      if n mod i=0 then p:=true;

   if p=false then
      begin
         m:=n;
         repeat
            s:=0;
            repeat
               c:= m mod 10;
               s:=s+c;
               m:=m div 10;
            until m=0;
            m:=s;
         until s<=9;
         cn:=s;
         write(n,' ',cn,' '); 

       end;
 end;
end.

Приклад 4

Дано натуральне число n. З’ясуйте, чи є воно симетричним (3434, 345345).

Визначення

Натуральне число n називається симетричним, якщо існує таке натуральне число m, що виконується рівність n div 10m=n mod 10m. Число дорівнює кількості цифр у числі n, поділеній на 2.

Результат роботи програми

ВвідВивід
345345yes
345no

Змінні:

Вхідні:
  • n – натуральне число (цілого типу)
Вихідні:
  • m – степінь числа 10, половина від k кількості цифр числа (цілого типу)
Проміжні:
  • i – параметр циклу (цілого типу)
  • k – кількість цифр числа n (цілого типу)
  • x – копія числа n (цілого типу)
  • d – 10m (цілого типу).

Алгоритм

  1. У цій задачі використовуються такі алгоритми:
    • знаходження кількості цифр числа;
    • піднесення числа до натурального степеня.
  2. Зрозуміло, що алгоритми використовуються послідовно.
  3. Алгоритм програми докладніше:
  4. Вводимо число n.
  5. Запам’ятовуємо це число у змінну x, бо алгоритм знаходження кількості цифр у числі змінює число n.
  6. Встановимо початкове значення k лічильника цифр у числі.
  7. Використаємо алгоритм знаходження кількості цифр числа x: відкидаємо останню цифру від числа, накопичуючи лічильник k. Все це робимо поки не переберемо всі цифри числа (у програмі виділено жирним).
  8. Знайдемо m:=k div 2.
  9. Знайдемо d=10m (у програмі виділено жирним). Для цього:
    • встановимо початкове значення добутку d:=1;
    • у циклі for  m раз виконаємо оператор d:=d*10.
  10. Порівняємо частку та остачу від ділення n на d:
    • Якщо співпадають, то виводимо „число симетричне”;
    • Якщо не співпадають, то виводимо „число не симетричне”.

Програма

 var n,x,d,i,k,m:longint;
begin
 read(n); x:=n;
 k:=0;
 repeat
    k:=k+1;
    x:=x div 10;
 until x=0;

 m:=k div 2;
 d:=1;
 for i:=1 to m do d:=d*10;

   if n div d=n mod d then
        writeln('симетричне ')
   else writeln('несиметричне ');
end.

Приклад 5

Надрукувати перші 5 шестизначних симетричних чисел.
В цій задачі використовуються такі алгоритми:
  • Пошук декількох чисел (5), що задовольняють деякій умові (в нашій задачі: чи є число симетричним?);
  • Визначення, чи є число симетричним?
Зрозуміло, що другий алгоритм вкладений у першій.

Змінні:

Вхідних даних немає.
Вихідні:
  • – шукані числа (цілого типу)
Проміжні:
  • t – лічильник шуканих чисел (цілого типу)
  • x – копія числа n (цілого типу)
  • – параметр циклу (цілого типу)
  • k – кількість цифр числа n (цілого типу)
  • m – степінь числа 10, половина від кількості цифр числа (цілого типу)
  • d – 10m (цілого типу).

Алгоритм

  1. Якщо згадати перший алгоритм, то у ньому:
    • До циклу задаються початкові значення числу n та кількості чисел t .
    • В тілі циклу repeat:
      • Збільшується значення числа n;
      • Число n перевіряється на якусь умову: якщо умова вірна, то число друкується та збільшується лічильник таких чисел t.
    • Перевіряється умова завершення циклу: чи надрукована потрібна кількість таких чисел?
      • Якщо так, то цикл завершується і кінець програми;
      • Якщо ні, то перехід на початок тіла циклу.
  2. Зрозуміло, що цей алгоритм буде зовнішнім циклом у нашій програмі і перебір та перевірку чисел потрібно починати з числа 100000, бо нам потрібні шестизначні числа.
  3. Умова, на яку у цьому циклі перевіряється число n, це – чи є це число симетричним? Алгоритм, який це визначає буде вкладений в перший.
  4. Тепер згадаємо другий алгоритм, який перевіряє, чи є число n симетричним:
    • Обчислюємо k кількість цифр у числі;
    • Обчислюємо m половину кількості цифр у числі;
    • Обчислюємо d =10m.
    • Перевіряємо рівність n div d=n mod d:
      • Якщо рівність вірна, то число n - симетричне, ми його друкуємо та збільшуємо лічильник таких чисел.
      • Якщо рівність не вірна, то число n - несиметричне.
  5. Другий алгоритм вкладений у перший перед перевіркою числа n (виділено жирним).

Програма

 var n,t,k,x,m,d,i:longint;
begin
 n:=100000;t:=0;
 repeat
   n:=n+1;
   k:=0; x:=n;
   repeat
     k:=k+1;
     x:=x div 10;
   until x=0;
   m:=k div 2;
   d:=1;
   for i:=1 to m do d:=d*10;

     if n div d=n mod d then
       begin
         write(n,’ ‘); t:=t+1;
       end;
 until t=5;
end.

Результат роботи програми

Відповідь
100100 101101 102102 103103 104104

Варіанти задач

  1. Надрукувати всі числа з інтервалу [100, 200], цифровий корінь яких кратний 3 (3, 6, 9).
  2. Дано число a. Зайдіть a перших простих чисел.
  3. Дано число a. Знайти просте число, що більше a.
  4. Дано число a. Знайдіть 5 простих чисел, більших a.
  5. Дано число a. Знайти найближче до нього просте число.
  6. Знайдіть всі числа з інтервалу (100, 200), цифровий корінь яких є простим числом (1, 2, 3, 5, 7).
  7. Знайдіть всі числа з інтервалу (100, 200), які кратні своєму цифровому кореню.
  8. Знайдіть цифрові корені чисел Фібоначчі, що належать інтервалу (100, 1000).
  9. Обчисліть та надрукувати цифрові корені досконалих чисел, що належать діапазону (1; 10000). Натуральне число називається досконалим, якщо воно дорівнює сумі своїх дільників, із урахуванням 1 і за винятком самого числа. Наприклад, число 6 - досконале (6=1+2+3).
  10. Знайдіть всі симетричні числа з інтервалу [10000, 1000000].
  11. Знайдіть всі симетричні паліндроми з інтервалу [1000000, 1000000000]. Поясненняпаліндром - це число, яке читається однаково справа наліво та зліва направо, тобто саме число дорівнює перевернутому числу.
  12. Надрукувати з чисел Фібоначчі в інтервалі від 1 до 100, тільки прості числа, а також їх порядкові номери в ряду Фібоначчі.
  13. Для всіх чисел, що належать діапазону [100; 120] обчислити та надрукувати ті дільники, що є членами послідовності Фібоначчі.
  14. Надрукувати всі чотирьохзначні симетричні числа та знайдіти їх кількість.
  15. Знайдіть цифрові корені всіх симетричних чисел, що належать інтервалу (10000, 100000).
  16. Надрукувати перші 10 п’ятизначних паліндромів, що є простими числами. Поясненняпаліндром - це число, яке читається однаково справа наліво та зліва направо, тобто саме число дорівнює перевернутому числу.

Немає коментарів:

Дописати коментар