Clasa a XII-a · Matematică pentru programareRead in English

Suma unei progresii aritmetice: formulă vs. buclă în C++

În engleză: Sum of an arithmetic progression: formula vs. loop

O(1)C++1753 de linii2 exemple

Ideea

Progresia are primul termen a, rația r și n termeni: a, a + r, ..., a + (n-1) * r. Bucla adună termenii unul câte unul, deci face n pași. Formula lui Gauss dă direct S = n * a + r * n * (n-1) / 2 (produsul n * (n-1) este mereu par, deci împărțirea e exactă). Programul calculează suma în ambele feluri, ca să vezi că dau același rezultat; pentru n = 10^12 bucla ar dura minute, formula răspunde instant. Prima linie: formula, a doua: bucla.

Descrierea în engleză

The progression has first term a, common difference r and n terms: a, a + r, ..., a + (n-1) * r. The loop adds the terms one by one, so it takes n steps. Gauss's formula gives directly S = n * a + r * n * (n-1) / 2 (the product n * (n-1) is always even, so the division is exact). The program computes the sum both ways, so you can see they give the same result; for n = 10^12 the loop would take minutes, the formula answers instantly. First line: the formula, second: the loop.

Complexitate
O(1) cu formula, O(n) cu bucla
Clasa
Clasa a XII-a (Grade 12)

Exemple

Exemplul 1

Intrare

1 1 100

Ieșire așteptată

5050
5050
Exemplul 2

Intrare

3 4 1000000

Ieșire așteptată

2000001000000
2000001000000

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

suma-progresiei-formula-vs-bucla.cpp
/*
 * Titlu: Suma unei progresii aritmetice: formulă vs. buclă
 * Clasa: 12
 * Capitol: Matematică pentru programare
 * Descriere: Progresia are primul termen a, rația r și n termeni: a, a + r, ...,
 *            a + (n-1) * r. Bucla adună termenii unul câte unul, deci face n
 *            pași. Formula lui Gauss dă direct S = n * a + r * n * (n-1) / 2
 *            (produsul n * (n-1) este mereu par, deci împărțirea e exactă).
 *            Programul calculează suma în ambele feluri, ca să vezi că dau
 *            același rezultat; pentru n = 10^12 bucla ar dura minute, formula
 *            răspunde instant. Prima linie: formula, a doua: bucla.
 * Complexitate: O(1) cu formula, O(n) cu bucla
 *
 * Exemplu
 * Intrare: 1 1 100
 * Ieșire:
 * 5050
 * 5050
 *
 * Exemplu
 * Intrare: 3 4 1000000
 * Ieșire:
 * 2000001000000
 * 2000001000000
 */
#include <iostream>
using namespace std;

long long sumaFormula(long long a, long long r, long long n)
{
    return n * a + r * (n * (n - 1) / 2);
}

long long sumaBucla(long long a, long long r, long long n)
{
    long long s = 0, termen = a;
    for (long long i = 1; i <= n; i++)
    {
        s += termen;
        termen += r;
    }
    return s;
}

int main()
{
    long long a, r, n;
    cin >> a >> r >> n;
    cout << sumaFormula(a, r, n) << '\n';
    cout << sumaBucla(a, r, n) << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.