Назад Зміст Вперед

Задачі з використанням двох змінних для вводу послідовності чисел

В попередніх задачах для вводу будь-якої послідовності чисел ми використовували одну змінну. На кожному наступному витку циклу ми вводили нове значення у цю змінну затираючи попереднє значення. Це нас влаштовувало, бо попереднє значення цієї змінної нам було не потрібно. Але існують задачі в яких потрібні два значення: „попереднє” (a1) та „наступне” (a2), наприклад для порівняння. Причому, кожне число (окрім першого та останнього) на одному витку циклу є „наступним”, а на другому витку „попереднім”.

В цих випадках перед циклом вводиться „попереднє”, в циклі завжди вводиться „наступне”, а перед переходом на наступний виток циклу „наступне” стає „попереднім”.

Правило

  1. Перед циклом потрібно ввести перше число у змінну (a1). Воно буде „попереднім”.
  2. У циклі, (цикл від 2, бо одне число вже ввели):
    1. Вводиться „наступне” число у змінну (a2)
    2. З числами a1 та a2 виконуються необхідні дії, наприклад їх порівнюють (або використовують інший алгоритм).
    3. Перед переходом на наступний виток циклу, „наступне” значення повинно стати „попереднім”. Для цього використовують присвоювання a1=a2.
  3. Після завершення циклу виводять на екран результат.

Приклад

Введіть з клавіатури n цілих чисел. Чи є серед цих чисел два рівних числа, що розташовані поруч? Відповідь „yes” чи „no”. Наприклад, для послідовності з чотирьох чисел 3, 7, 7, 6, відповідь буде „yes”, а для послідовності 3, 7, 5, 3 відповідь буде „no”.

Дано: кількість чисел та самі числа.

Знайти: Якщо є хоча б один випадок, коли „наступне” число = „попередньому”, то надрукувати yes, якщо таких випадків немає, то надрукувати no.

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

ВвідВивідПояснення
5
1 2 4 4 6
Yes Чисел 5.
4=4, тому Yes
5
1 7 5 7 3
NO Чисел 5.
Є два однакових числа, але вони розташовані не поряд, тому No

Змінні:

Вхідні:

Вихідні:

Проміжні:

Алгоритм

  1. Спочатку потрібно присвоїти початкове значення ознаці false. Будемо вважати, що таких чисел немає. Тоді якщо зустрінемо такі числа, змінимо це значення на протилежне.
  2. Вводимо n – кількість чисел, що будемо вводити.
  3. До початку циклу вводимо перше число у змінну a1. Воно буде «попереднім». Його будемо порівнювати з «наступним» a2.
  4. Оскільки перше число введено, то заголовок циклу буде від 2. У циклі будемо виконувати такі дії:
    1. Вводимо «наступне» число у змінну a2.
    2. Будемо шукати рівність а1 та а2. Якщо знайдемо, то змінюємо значення змінної на p=true. У протилежному випадку нічого не робимо, тобто значення p не змінюється.
    3. Введене число a2 на цьому витку циклу є «наступним». На наступному витку циклу воно буде «попереднім». Тому перед переходом на наступний виток циклу потрібно виконати оператор a1=a2.
  5. Коли цикл закінчиться, тобто будуть введені всі n чисел, значення змінної p (ознаки) або залишиться початковим false (якщо завжди було a2!=a1), або зміниться на true (якщо хоча б один раз було a2=a1).
  6. Після завершення циклу потрібно перевірити значення змінної p.
    1. Якщо p=false, то надрукувати no.
    2. Якщо p=true, то надрукувати yes.

Програма перевірки наявності однакових сусідніх елементів

#include <iostream>
using namespace std;

int main()
{
    int i, n, a1, a2;  // i - лічильник, n - кількість елементів
                       // a1, a2 - попередній та поточний елементи
    bool p = false;    // Прапорець наявності однакових сусідів
    
    cin >> n;          // Введення кількості елементів
    cin >> a1;         // Введення першого елементу
    
    // Перебір решти елементів
    for (i = 2; i <= n; i++)
    {
        cin >> a2;     // Введення наступного елементу
        
        // Перевірка на однаковість з попереднім елементом
        if (a1 == a2) {
            p = true;  // Знайдено однакові сусідні елементи
        }
        a1 = a2;       // Зберігаємо поточний елемент для наступної ітерації
    }
    
    // Виведення результату
    if (p) {
        cout << "yes";  // Знайдено однакові сусідні елементи
    } else {
        cout << "no";   // Однакових сусідніх елементів не знайдено
    }
    
    return 0;
}

Пояснення роботи програми:

Програма виконує наступні дії:

  1. Зчитує кількість елементів n
  2. Зчитує перший елемент a1
  3. Послідовно зчитує решту n-1 елементів у циклі
  4. Порівнює кожен елемент з попереднім
  5. Якщо знайдено хоча б одну пару однакових сусідніх елементів, встановлює прапорець p в true
  6. Виводить "yes", якщо знайдені однакові сусідні елементи, інакше - "no"

Тестування роботи програми:

Тест 1 (є однакові сусіди):
Вхідні дані:
5
3 5 5 2 1
Вихід:
yes

Тест 2 (немає однакових сусідів):
Вхідні дані:
4
1 2 3 4
Вихід:
no

Додаткові примітки:

Приклад 1

Дано n цілих чисел. Чи є ця послідовність зростаючою?

Дано: кількість чисел та самі числа.

Знайти: Якщо кожне „наступне” число більше „попереднього”, то надрукувати yes, якщо є число яке менше чи дорівнює тому що перед ним, то надрукувати no.

Ясно, що у цій програмі окрім описаного нового алгоритму, потрібно використовувати вже відомий алгоритм „з логічною змінною”, або з ознакою. Цей алгоритм потрібний, бо для деякої послідовності чисел, потрібно відповісти на питання „так”, або „ні”.

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

ВвідВивідПояснення
5
1 2 13 44 68
Yes Чисел 5.
1<2<13<44<68, тому Yes
5
1 7 5 6 3
NO Чисел 5.
1<7, але 7>5, тому No
6
0 1 3 4 5 5
NO Чисел 6.
0<1<3<4<5, але 5=5, тому No

Змінні:

Вхідні:

Вихідні:

Проміжні:

Алгоритм

  1. Спочатку потрібно присвоїти початкове значення ознаці f=true. Будемо вважати, що послідовність зростає. Тоді якщо зустрінемо не зростання, змінимо це значення на протилежне.
  2. Вводимо n – кількість чисел, що будемо вводити.
  3. До початку циклу вводимо перше число у змінну a1. Воно буде «попереднім». Його будемо порівнювати з «наступним» a2.
  4. Оскільки перше число введено, то заголовок циклу буде від 2. У у циклі будемо виконувати такі дії:
    1. Вводимо «наступне» число у змінну a2.
    2. Будемо шукати незростання. Тобто, якщо умова зростання це а1 < a2, то умова незростання це !(а1 < a2). Тобто ми шукаємо такі числа, які відповідають протилежній умові. Тут зручно використовувати префікс не (!). Якщо знайдемо такі числа, то змінюємо значення змінної на f=false. У протилежному випадку нічого не робимо, тобто значення f не змінюється.
    3. Введене число a2 на цьому витку циклу є «наступним». На наступному витку циклу воно буде «попереднім». Тому перед переходом на наступний виток циклу потрібно виконати оператор a1=a2.
  5. Коли цикл закінчиться, тобто будуть введені всі n чисел, значення змінної f (ознаки) або залишиться початковим true (якщо завжди було a2>a1), або зміниться на false (якщо хоча б один раз було a2<=a1).
  6. Після завершення циклу потрібно перевірити значення змінної f.
    1. Якщо f=false, то надрукувати no.
    2. Якщо f=true, то надрукувати yes.
#include <iostream>
using namespace std;
int main()
{
    int i, n, a1, a2; // Оголошення змінних: i - лічильник, n - кількість елементів, a1 та a2 - попередній та поточний елементи
    bool f = true;    // Прапорець для перевірки умови
    
    cin >> n >> a1; // Введення кількості елементів та першого елемента
    
    for (i = 2; i <= n; i++) // Цикл для введення та перевірки наступних елементів
    {
        cin >> a2;
        if (!(a2 > a1)) // Перевірка, чи поточний елемент більший за попередній
        {
            f = false; // Якщо умова не виконується, встановлюємо прапорець у false
        }
        a1 = a2; // Оновлення попереднього елемента
    }
    
    if (f) // Виведення результату на основі прапорця
    {
        cout << "yes";
    }
    else
    {
        cout << "no";
    }
    
    return 0; // Завершення програми
}

Пояснення до коду:

Запис складних умов

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

Запишемо порушення умови того, що однозначні і двозначні числа йдуть по черзі.

Найпростіше такі умови записувати з запереченням. Тобто записуємо умову, для якої вивели б «так», беремо її в дужки і ставимо перед дужками знак заперечення (!)

Спочатку запишемо умову того, що однозначні і двозначні числа йдуть по черзі. Можливі два варіанти:

  1. Попереднє однозначне, а наступне двозначне
    
    a1 / 10 == 0 && a2 / 100 == 0 && a2 / 10! = 0
    
  2. Або навпаки: попереднє двухзначное, а наступне однозначне
    a1 / 100 == 0 && a1 / 10! = 0 && a2 / 10 == 0
    

Повна умова того, що однозначні і двозначні числа йдуть по черзі:


(a1 / 10 == 0 && a2 / 100 == 0 && a2 / 10! = 0 ||
 a1 / 100 == 0 && a1 / 10! = 0 && a2 / 10 == 0)

Порушення цієї умови:


(!(a1 / 10 == 0 && a2 / 100 == 0 && a2 / 10! = 0 ||
    a1 / 100 == 0 && a1 / 10! = 0 && a2 / 10 == 0))

Зверніть увагу на дужки: прості умови в дужки не беруться, тому що логічна операція && виконується раніше, ніж логічна операція ||.

Але все умова береться в дужки (), тому що заперечення (!) відноситься до всеї складної умові.

Зовнішні дужки () відносяться до синтаксису оператора if

Приклад 2

Ввести з клавіатури n будь-яких цілих чисел. З’ясуйте чи створюють ці числа зростаючу арифметичну прогресію, тобто чи є різниця між „наступним” та „попереднім” числами додатною та однаковою для всіх чисел. Відповідь „так” чи „ні”.

Дано: кількість чисел та самі числа.

Знайти: Якщо кожне „наступне” число більше „попереднього” на однакове додатне число, то надрукувати yes, якщо ні, то надрукувати no.

Ясно, що у цій програмі, окрім описаних вище алгоритмів, потрібно знайти різницю між другим та першим числами і, якщо вона додатна, порівнювати її з різницею між третім та другим, четвертим та третім і.т.і. А для того, щоб знайти різницю між першим та другим числами, потрібно два перших числа ввести до початку циклу, а інші числа вже вводити в циклі.

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

ВвідВивідПояснення
5
3 6 9 12 15
Yes Чисел 5. 6-3=3, це >0,
9-6=3, 12-9=3, 15-12=3, тому Yes
4
12 8 4 0
NO Чисел 4.
8-12=-4, це <0, тому No
3
10 12 15
NO Чисел 3. 12-10=2, це >0,
15-12=3, 3!=2, тому No

Змінні:

Вхідні:

Вихідні:

Проміжні:

Алгоритм

  1. Вводимо n – кількість чисел, що будемо вводити.
  2. Вводимо перше число у змінну a0, а друге число у змінну a1 (воно буде „попереднім”).
  3. Знайдемо різницю між другим та першим числом: p1=a1-a0.
  4. Тепер потрібно присвоїти початкове значення ознаці f. Якщо p1>0, то f=true, тобто будемо вважати, що послідовність зростає і є арифметичною прогресією. Якщо p1<0, то f=false, бо послідовність вже не є зростаючою.
  5. Оскільки введено вже два числа, то заголовок циклу має бути від 3. У фігурних дужках будемо виконувати такі дії:
    1. Вводимо „наступне” число у змінну a2.
    2. Знайдемо різницю між „наступним” та „попереднім” числами оператором p2=a2-a1.
    3. Будемо шукати порушення того, що ці числа утворюють зростаючу арифметичну послідовність. Тобто якщо обчислена різниця між „наступним” та „попереднім” числами p2 не співпадає з різницею між „першим” та „другим” числами p1, то змінюємо значення змінної на f=false. У протилежному випадку нічого не робимо, тобто значення f не змінюється.
    4. Введене число a2 на цьому витку циклу є «наступним». На наступному витку циклу воно буде «попереднім». Тому перед переходом на наступний виток циклу потрібно виконати оператор a1=a2.
  6. Коли цикл закінчиться, тобто будуть введені всі n чисел, значення змінної f (ознаки) або залишиться початковим true (якщо завжди було p2=p1), або зміниться на false (якщо хоча б один раз було p2!=p1).
  7. Після завершення циклу потрібно перевірити значення змінної f.
    1. Якщо f=false, то надрукувати no.
    2. Якщо f=true, то надрукувати yes.
#include <iostream>
using namespace std;
int main()
{
    int i,n,a0,a1,a2,p1,p2; bool f;
    cin>>n>>a0>>a1;
    p1=a1-a0;
    if (p1>0){f=true;}else {f=false;}
    for (i=3;i<=n;i++)
    {
    cin>>a2;
    p2=a2-a1;
    if (p2!=p1){f=false;}
    a1=a2;
    }
    if (f)(cout<<"yes";)
    else (cout<<"no";)
    return 0;
}

Пояснення коду:

Приклад 3

Дано n цілих чисел. Визначте максимальну кількість 0, що йдуть підряд.

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

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

ВвідВивідПояснення
7
2 0 0 8 0 0 0
3 7 це кількість чисел.
В першій групі 2 нулі, у другій групі 3 нулі, тому відповідь 3.

Змінні:

Вхідні:

Вихідні:

Проміжні:

Алгоритм

  1. Спочатку потрібно ввести кількість чисел .
  2. Потім потрібно встановити початкове значення змінній max=0, тобто вважаємо що нулів немає.
  3. Встановлюємо початкове значення лічильника нулів k=0.
  4. У циклі будемо виконувати такі дії:
    1. Вводити наступне число у змінну a.
    2. Якщо введене число 0, то:
      1. Збільшуємо лічильник нулів k=k+1
      2. Якщо цей лічильник k>max, то запам’ятовуємо його значення max=k
    3. Якщо введено число не 0, встановлюємо значення лічильника у нуль k=0
  5. Коли цикл закінчиться, тобто будуть введені всі n чисел, у змінній max буде максимальне значення серед лічильників нулів k. Це число виводиться на екран.
#include <iostream>
using namespace std;
int main()
{
    int i,n,a,k,max;
    cin>>n;
    max=0; k=0;
    for (i=1;i<=n;i++)
    {
    cin>>a;
    if (a==0)
    {
    k++;
    if (k>max) {max=k;}
    }
    else {k=0;}
    }
    cout<<max;
    return 0;
}

Пояснення коду:

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

Варіант 1

  1. Отримайте випадковим чином n цілих чисел з інтервалу [-10; 10]. Чи є серед цих чисел два числа, що розташовані поруч та мають однакові знаки (обидва додатні чи обидва від’ємні)? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. Чи є ця послідовність спадаючою? Відповідь „yes” чи „no”.

Варіант 2

  1. Отримайте випадковим чином n цілих чисел з інтервалу [-10; 10]. Чи є серед цих чисел два парних числа, що розташовані поруч? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. Чи є ця послідовність спадаючою арифметичною прогресією? Відповідь „yes” чи „no”.

Варіант 3

  1. Отримайте випадковим чином n цілих чисел з інтервалу [10; 30]. Чи є серед цих чисел два числа, що розташовані поруч та обидва закінчуються цифрою 0? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність знакозмінною, тобто такою, в якій два сусідніх числа мають різні знаки, тобто додатні та від’ємні числа ідуть по черзі. Відповідь „yes” чи „no”.

Варіант 4

  1. Отримайте випадковим чином n цілих чисел з інтервалу [10; 20]. Чи є серед цих чисел два числа, що розташовані поруч та обидва закінчуються цифрою 1? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій два сусідніх числа мають різну парність, тобто парні та непарні числа ідуть по черзі. Відповідь „yes” чи „no”.

Варіант 5

  1. Отримайте випадковим чином n цілих чисел з інтервалу [20; 40]. Чи є серед цих чисел два числа, що розташовані поруч та обидва закінчуються цифрою 3? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій числа, що кратні 3 та що не кратні 3 ідуть по черзі. Відповідь „yes” чи „no”.

Варіант 6

  1. Отримайте випадковим чином n цілих чисел з інтервалу [10; 40]. Чи є серед цих чисел два числа, що розташовані поруч та обидва закінчуються цифрою 5? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій числа, що кратні 5 та що не кратні 5 ідуть по черзі. Відповідь „yes” чи „no”.

Варіант 7

  1. Отримайте випадковим чином n цілих чисел з інтервалу [10; 30]. Чи є серед цих чисел два числа, що розташовані поруч та обидва кратні 5? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій числа, що закінчуються на 0 та що не закінчуються на 0 ідуть по черзі. Відповідь „yes” чи „no”.

Варіант 8

  1. Отримайте випадковим чином n цілих чисел з інтервалу [-1; 1]. Чи є серед цих чисел два числа, що розташовані поруч та обидва =0? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій числа, що закінчуються на 1 та що не закінчуються на 1 ідуть по черзі. Відповідь „yes” чи „no”.

Варіант 9

  1. Отримайте випадковим чином n цілих чисел з інтервалу [10; 20]. Чи є серед цих чисел два числа, що розташовані поруч та мають різну парність (одне парне, інше непарне)? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій по черзі ідуть однозначні та двозначні числа. Відповідь „yes” чи „no”.

Варіант 10

  1. Отримайте випадковим чином n цілих чисел з інтервалу [20; 40]. Чи є серед цих чисел два числа, що розташовані поруч та мають різну кратність 3 (одне кратне 3, інше не кратне 3)? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій по черзі ідуть числа, що закінчуються на 0 та що закінчуються на 1. Відповідь „yes” чи „no”.

Варіант 11

  1. Отримайте випадковим чином n цілих чисел з інтервалу [30; 50]. Чи є серед цих чисел два числа, що розташовані поруч та мають різну кратність 7 (одне кратне 7, інше не кратне 7)? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій по черзі ідуть числа, що закінчуються на 3 та що закінчуються на 5. Відповідь „yes” чи „no”.

Варіант 12

  1. Отримайте випадковим чином n цілих чисел з інтервалу [10; 30]. Чи є серед цих чисел два числа, що розташовані поруч та одне з них закінчуються цифрою 5, а інше ні? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій по черзі ідуть однозначні та не однозначні числа. Відповідь „yes” чи „no”.

Варіант 13

  1. Отримайте випадковим чином n цілих чисел з інтервалу [0; 20]. Чи є серед цих чисел два однозначних числа, що розташовані поруч? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. Чи є ця послідовність зростаючою геометричною прогресією? Відповідь „yes” чи „no”.

Варіант 14

  1. Отримайте випадковим чином n цілих чисел з інтервалу [-20; 20]. Чи є серед цих чисел два двозначних числа, що розташовані поруч? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. Чи є ця послідовність спадаючою геометричною прогресією? Відповідь „yes” чи „no”.

Варіант 15

  1. Отримайте випадковим чином n цілих чисел з інтервалу [50; 200]. Чи є серед цих чисел два тризначних числа, що розташовані поруч? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. Чи є ця послідовність арифметичною прогресією (спадаючою чи зростаючою)? Відповідь „yes” чи „no”.

Варіант 16

  1. Отримайте випадковим чином n цілих чисел з інтервалу [-10; 20]. Чи є серед цих чисел два числа, що розташовані поруч та одне з них однозначне, а інше ні? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. Чи є ця послідовність геометричною прогресією (спадаючою чи зростаючою)? Відповідь „yes” чи „no”.

Варіант 17

  1. Отримайте випадковим чином n цілих чисел з інтервалу [-10; 20]. Чи є серед цих чисел два числа, що розташовані поруч та одне з них однозначне, а інше двозначне? Відповідь „yes” чи „no”.
  2. Введіть з клавіатури n цілих чисел. З’ясуйте, чи є ця послідовність такою, в якій по черзі ідуть двозначні та тризначні числа. Відповідь „yes” чи „no”.

Назад Зміст Вперед