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

Задачі на обчислення елементів послідовності з заданою точністю

Ми обчислювали елементи послідовності трьома способами:

  1. Підставляли номер елемента послідовності у формулу. Наприклад,
  2. Використовували значення одного попереднього елемента. Наприклад,
  3. Використовували значення двох попередніх елементів. Наприклад,

Але ми завжди знали, скільки елементів послідовності потрібно обчислити та надрукувати, тому використовували оператор FOR.

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

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

Приклад 1

Для послідовності написати такі програми:

  1. Дано дійсне число e. Друкувати елементи послідовності, поки ai >=e
  2. Дано дійсне число e. Знайти суму елементів послідовності, які ai >=e
  3. Дано дійсне число e. Знайти перший елемент послідовності та його порядковий номер, який < e
  4. Дано дійсне число e. Друкувати елементи послідовності, поки ai-1- ai >=e

У цій задачі елементи послідовності обчислюються підставленням їх номера (i) у формулу. Підставимо та отримаємо:

a1=2.0000 a2=1.5000 a3=1.3333 a4=1.2500 a5=1.2000...

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

Дано дійсне число e. Друкувати елементи послідовності, поки ai >=e

Ввід Вивід
e=1.2 2.0000 1.5000 1.3333 1.2500 1.2000

Програма 1

#include <iostream>
using namespace std;

int main()
{
    int i;         // Лічильник ітерацій
    float a, e;    // a - поточний член послідовності, e - граничне значення
    cin >> e;     // Введення граничного значення

    // Налаштування формату виводу (4 знаки після коми)
    cout << fixed;
    cout.precision(4);

    i = 1;        // Початкове значення лічильника
    a = 2;        // Початкове значення послідовності

    // Генерація послідовності поки a >= e
    while (a >= e)
    {
        cout << a << " ";  // Вивід поточного значення
        i++;               // Інкрементація лічильника
        a = i + 1.0 / i;   // Обчислення наступного члена послідовності
    }

    return 0;
}

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

Дано дійсне число e. Знайти суму елементів послідовності, які ai >=e

Ввід Вивід
e=1.2 s=7.2833

Програма 2

#include <iostream>
using namespace std;

int main()
{
    int i;              // Лічильник ітерацій
    float a, e, s = 0; // a - член послідовності, e - граничне значення, s - сума
    cin >> e;         // Введення граничного значення

    // Налаштування формату виводу (4 знаки після коми)
    cout << fixed;
    cout.precision(4);

    i = 1;             // Початкове значення лічильника
    a = 2;             // Початкове значення послідовності (a₁ = 2)

    // Обчислення суми членів послідовності, поки a ≥ e
    while (a >= e)
    {
        s = s + a;     // Додавання поточного члена до суми
        i++;           // Інкрементація лічильника
        a = i + 1.0/i; // Обчислення наступного члена послідовності (aₙ = n + 1/n)
    }

    cout << "S=" << s; // Виведення суми
    return 0;
}

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

Дано дійсне число e. Знайти перший елемент послідовності та його порядковий номер, який < e

Ввід Вивід
e=1.2 a=1.1667 i=6

Програма 3

#include <iostream>
using namespace std;

int main()
{
    int i;           // Лічильник ітерацій
    float a, e;      // a - поточний член послідовності, e - граничне значення
    cin >> e;      // Введення граничного значення

    // Налаштування формату виводу (4 знаки після коми)
    cout << fixed;
    cout.precision(4);

    i = 1;          // Ініціалізація лічильника
    a = 2;          // Початкове значення послідовності (a₁ = 2)

    // Цикл пошуку першого члена послідовності, меншого за 'e'
    while (a >= e)
    {
        i++;        // Інкрементація лічильника
        a = i + 1.0 / i;  // Обчислення наступного члена (aₙ = n + 1/n)
    }

    // Виведення результату
    cout << "a=" << a << " i=" << i;
    return 0;
}

Програма 4

Дано дійсне число e. Друкувати елементи послідовності, поки ai-1- ai >=e

Ця задача відрізняється від задачі у прикладі 1 тим, що елементи послідовності обчислюються та виводяться на екран тоді, коли різниця між „попереднім” та „наступним” елементами досить велика та перевищує введене число e.

Тобто потрібно додатково використовувати вже відомий алгоритм: для зберігання елементів послідовності використовувати дві змінних – „попереднє” (a1) та „наступне” (a2). Причому, кожний елемент послідовності (окрім першого та останнього) на одному витку циклу є „наступним”, а на другому витку „попереднім”.

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

Ввід Вивід
0.03 2.0000 1.5000 1.3333 1.2500 1.2000 1.1667
0.02 2.0000 1.5000 1.3333 1.2500 1.2000 1.1667 1.1429

Змінні:

Вхідні:

Вихідні:

Проміжні:

Алгоритм

  1. Введемо з клавіатури значення e.
  2. Оскільки ми будемо порівнювати різницю між „попереднім” та „наступним” елементами послідовності та число e, та використовувати цикл з передумовою while, то до початку циклу потрібно:
    1. обчислити значення двох перших елементів послідовності та їх порядкових номерів, операторами: i=1; a1=2; i=2; a2=1.5;
    2. вивести на екран значення першого („попереднього”) елемента послідовності
  3. Нам потрібно друкувати елементи послідовності, різниця між якими >=e. Тому у заголовку циклу while будемо перевіряти цю умову:
    1. Якщо умова вірна (різниця між двома сусідніми елементами >=e), то тіло циклу буде виконуватись, перехід на п 4.
    2. Якщо умова невірна, то тіло циклу пропускається, виконується перехід на оператори після циклу, в нашому випадку на кінець.
  4. У тілі циклу, у фігурних дужках будемо виконувати такі дії:
    1. Виведемо на екран значення обчисленого раніше „наступного” елементу.
    2. Виведений елемент a2 на цьому витку циклу є «наступним». На наступному витку циклу він буде «попереднім». Тому до переходу на наступний виток циклу потрібно виконати оператор a1=a2.
    3. Обчислимо порядковий номер нового „наступного” елементу послідовності оператором i++.
    4. Обчислмо новий „наступний” елемент послідовності оператором a2=1+1/i.
    5. Наприкінці тіла циклу виконується перехід на заголовок для перевірки різниці між „попереднім” та „наступним” елементами (на пункт 3).

Програма 4

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int i;              // Лічильник ітерацій
    float a1, a2, e;    // a1, a2 - попередній та поточний члени послідовності, e - точність
    cin >> e;       // Введення точності обчислень

    // Налаштування формату виводу (4 знаки після коми)
    cout << fixed;
    cout.precision(4);

    i = 1; a1 = 2;      // Ініціалізація першого члена
    cout << a1 << " "; // Виведення першого члена
    i = 2; a2 = 1.5;    // Ініціалізація другого члена

    // Цикл обчислення послідовності поки різниця між членами ≥ e
    while (abs(a1 - a2) >= e)
    {
        cout << a2 << " "; // Виведення поточного члена
        a1 = a2;           // Оновлення попереднього значення
        i++;               // Інкрементація лічильника
        a2 = 1 + 1.0 / i;  // Обчислення нового члена послідовності
    }

    return 0;
}

Приклад 2

Для послідовності Фібоначчи написати такі програми:

  1. Дано натуральне число e. Обчислювати елементи послідовності, поки ai <=e
  2. Дано натуральне число e. Знайти суму елементів послідовності, які ai <=e.
  3. Дано натуральне число e. Знайти перший елемент та його порядковий номер, який > e
  4. Дано натуральне число n. Чи є воно елементом цієї послідовності ?

У цій задачі кожний елемент послідовності обчислюється через два попередніх. Отримаємо:

f1=1 f2=1 f3=2 f4=3 f5=5 f6=8...

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

Дано натуральне число e. Обчислювати елементи послідовності, поки ai <=e

Ввід Вивід
e=10 1 1 2 3 5 8

Програма 1

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    long int e, f1, f2, f3;  // e - граничне значення, f1,f2,f3 - члени послідовності Фібоначчі
    cin >> e;               // Введення граничного значення

    f1 = 1;                  // Ініціалізація першого члена
    cout << f1 << " ";      // Виведення першого члена
    f2 = 1;                  // Ініціалізація другого члена

    // Генерація послідовності Фібоначчі до перевищення значення 'e'
    while (f2 <= e)
    {
        cout << f2 << " ";  // Виведення поточного члена
        f3 = f1 + f2;        // Обчислення наступного члена
        f1 = f2;             // Оновлення значень для наступної ітерації
        f2 = f3;
    }

    return 0;
}

У цьому прикладі до циклу присвоюємо значення двом першим елементам послідовності та перший елемент виводимо на екран.

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

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

Дано натуральне число e. Знайти суму елементів послідовності, які ai <=e.

Ввід Вивід
e=10 s=20

Програма 2

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    long int e, f1, f2, f3, s;  // e - граничне значення, f1,f2,f3 - члени Фібоначчі, s - сума
    cin >> e;                  // Введення граничного значення

    f1 = 1;                     // Перший член послідовності
    s = f1;                     // Початкове значення суми
    f2 = 1;                     // Другий член послідовності

    // Обчислення суми чисел Фібоначчі, що не перевищують 'e'
    while (f2 <= e)
    {
        s += f2;                // Додавання поточного члена до суми
        f3 = f1 + f2;           // Обчислення наступного члена
        f1 = f2;                // Оновлення значень для наступної ітерації
        f2 = f3;
    }

    cout << "S=" << s;       // Виведення суми
    return 0;
}

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

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

Дано натуральне число e. Знайти перший елемент та його порядковий номер, який > e

Ввід Вивід
e=10 f=13 i=7

Програма 3

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    long int e, f1, f2, f3, i;  // e - граничне значення, f1-f3 - числа Фібоначчі, i - лічильник
    cin >> e;                   // Введення граничного значення

    i = 1; f1 = 1;              // Ініціалізація першого числа (F₁=1)
    i = 2; f2 = 1;              // Ініціалізація другого числа (F₂=1)

    // Генерація чисел Фібоначчі до перевищення граничного значення
    while (f2 <= e)
    {
        i++;                    // Інкрементація лічильника
        f3 = f1 + f2;           // Обчислення наступного числа (Fₙ = Fₙ₋₁ + Fₙ₋₂)
        f1 = f2;                // Оновлення значень для наступної ітерації
        f2 = f3;
    }

    // Виведення першого числа, що перевищує 'e' та його порядкового номеру
    cout << "f=" << f2 << " i=" << i;
    return 0;
}

Для рішення цієї задачі теж можна використовувати програму обчислення елементів послідовності. Але щоб знайти перший ai > е, потрібно обчислювати елементи aі <= e. Оператор виводу елементу на екран потрібно виконати після завершення циклу.

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

Дано натуральне число n. Чи є воно елементом цієї послідовності?

Ввід Вивід
15 no
13 yes

Алгоритм

  1. Введемо з клавіатури значення n
  2. До початку циклу потрібно присвоїти початкові значення першим двом змінним (f1, f2).
  3. Далі, у циклі, будемо обчислювати елемент f3 до тих пір, поки його значення не стане більшим або рівним введеному числу n. Тобто цикл завершиться при f3>=n. Можливі два випадки: цикл завершився при f3>n , тобто всі наступні елементи послідовності більше n і такого числа у послідовності немає, або цикл завершився при f3=n, тоді таке число є у послідовності.
  4. Оскільки ми спочатку будемо обчислювати f3, а потім порівнювати його з n, краще використовувати цикл do while
  5. У циклі будемо обчислювати елементи послідовності Фібоначчі таким чином:
    1. За формулою обчислимо значення третьої змінної оператором f3=f2+f1.
    2. Перед переходом на наступний виток циклу переприсвоюємо значення двох „попередніх” елементів: f1=f2, f2=f3.
  6. Перевіримо умову завершення циклу:
    1. Якщо обчислений елемент f3>=n , то обчислювати елементи більше не потрібно і цикл завершується, виконується перехід на перший оператор після циклу (пункт 7).
    2. Якщо обчислений елемент f3< n , то потрібно ще обчислювати елементи послідовності і цикл продовжується, виконується перехід на перший оператор тіла циклу (пункт 5).
  7. Після завершення циклу потрібно перевірити, як завершився цикл:
    1. Якщо по f3=n, то ми знайшли елемент послідовності рівний n, і виведем на екран 'yes';
    2. Якщо по f3>n, то ми обчислили елемент більший за n і тому такого числа в послідовності немає і виведем на екран 'no'

Програма 4

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    long int n, f1, f2, f3;  // n - число для перевірки, f1-f3 - числа Фібоначчі
    cin >> n;               // Введення числа для перевірки

    f1 = 1; f2 = 1;          // Ініціалізація перших двох чисел Фібоначчі

    // Генерація чисел Фібоначчі, доки не досягнемо або не перевищимо 'n'
    do
    {
        f3 = f1 + f2;       // Обчислення наступного числа Фібоначчі
        f1 = f2;            // Оновлення значень для наступної ітерації
        f2 = f3;
    } while (f3 < n);       // Умова продовження циклу

    // Перевірка чи є введене число числом Фібоначчі
    if (f3 == n)
    {
        cout << "yes";      // Якщо число належить послідовності
    }
    else
    {
        cout << "no";       // Якщо число не належить послідовності
    }

    return 0;
}

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

  1. Дано дійсне число e. З чотирма знаками після крапки друкувати числа i=2,3... поки ai >=e.
  2. Дано дійсне число e. З чотирма знаками після крапки друкувати числа i=1,2,3... поки ai <=e.
  3. Дано дійсне число e. З чотирма знаками після крапки друкувати числа i=2,3... поки ai<=e.
  4. Дано дійсне число e. З трьома знаками після крапки знайти суму всіх чисел ai>=e, якщо числа i=1,2,3...
  5. Дано ціле число e. Знайти суму всіх чисел ai<=e, якщо числа i=1,2,3...
  6. Дано дійсне число e. Знайти серед чисел i=1,2,3... перше число ai< e і його номер i.
  7. Дано дійсні числа e, z(0< z <1), q(q >e). Знайти серед чисел i=2,3... перше число ai< e і його номер i.
  8. Дано дійсне число e. Знайти серед чисел i=2,3... перше число ai>e і його номер i.
  9. Дано натуральні числа e, x. Друкувати числа i=1,2,3... поки ai-ai-1<=e
  10. Дано дійсне число e. З трьома знаками після крапки друкувати числа i=2,3... поки .
  11. Дано дійсне число e. З 7 знаками після крапки знайти суму всіх чисел , i=2,3... , у яких
  12. Дано дійсне число e. З 7 знаками після крапки знайти суму всіх чисел , i=2,3..., у яких
  13. Дано дійсне число e та натуральне число x. Знайти серед чисел i=1,2,3... перше число ai і його номер i , таке що .
  14. Дано дійсні додатні числа e, x, b. Знайти серед чисел i=1,2,3... , перше число ai і його номер i , таке що .
  15. Дано натуральні числа e, z (z>1), q (q< e). Чи є серед чисел i=2,3... , число e?
  16. Дано натуральне число b. Чи є це число серед чисел послідовності i=3,4...?
  17. Дано натуральні числа x, b, c, d, q, r. Чи є число x серед чисел послідовності i=3,4...? Якщо ні, то надрукувати перше число ai і його номер i , таке що ai> x.

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