Гид по технологиям

Сумма геометрической прогрессии — примеры на Python, C++, JavaScript и C

5 min read Программирование Обновлено 02 Jan 2026
Сумма геометрической прогрессии — примеры
Сумма геометрической прогрессии — примеры

График популярности основных языков программирования

Когда вы стремитесь улучшить навыки программирования, рано или поздно полезно понять геометрические прогрессии. В геометрической прогрессии каждый следующий член получается умножением предыдущего на постоянный множитель.

В этой статье вы узнаете, как найти сумму конечной геометрической прогрессии (геометрического ряда) двумя способами: итеративно и с использованием формулы. Для каждой методики приведены реализации на Python, C++, JavaScript и C, а также разбор особых случаев и тест-кейсы.

Что такое геометрическая прогрессия и геометрический ряд

Геометрическая прогрессия (или геометрическая последовательность) выглядит так:

a, ar, ar^2, ar^3, ...

где

a = первый член
r = общее соотношение (common ratio)

Геометрический ряд — это сумма первых n членов геометрической прогрессии:

S_n = a + ar + ar^2 + … + ar^{n-1}

Если n стремится к бесконечности и |r| < 1, ряд сходится к a / (1 - r).

Задача

Даны: первый член a, общее соотношение r и число членов n. Требуется найти сумму первых n членов геометрического ряда.

Пример: a = 1, r = 2, n = 8. Ряд: 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128. Сумма: 255.

Итеративный подход

Идея: пройти по n членам, аккумулируя сумму и умножая текущий член на r на каждом шаге. Сложность O(n). Этот подход прост и стабилен для небольших n, но медленнее при очень больших n.

C++ — итерация

// C++ program to find the sum of geometric series  
#include   
using namespace std;  
  
// Function to find the sum of geometric series  
float sumOfGeometricSeries(float firstTerm, float commonRatio, int noOfTerms)  
{  
 float result = 0;  
 for (int i=0; i

Вывод:

First Term: 1  
Common Ratio: 2  
Number of Terms: 8  
Sum of the geometric series: 255

Python — итерация

# Python program to find the sum of geometric series  
  
# Function to find the sum of geometric series  
def sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms):  
    result = 0  
    for i in range(noOfTerms):  
        result = result + firstTerm  
        firstTerm = firstTerm * commonRatio  
    return result  
  
firstTerm = 1  
commonRatio = 2  
noOfTerms = 8  
print("First Term:", firstTerm)  
print("Common Ratio:", commonRatio)  
print("Number of Terms:", noOfTerms)  
print("Sum of the geometric series:", sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms))  

Вывод: тот же — 255.

JavaScript — итерация

// JavaScript program to find the sum of geometric series  
  
// Function to find the sum of geometric series  
function sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms) {  
 var result = 0;  
 for (let i=0; i

C — итерация

// C program to find the sum of geometric series  
#include   
  
// Function to find the sum of geometric series  
float sumOfGeometricSeries(float firstTerm, float commonRatio, int noOfTerms)  
{  
 float result = 0;  
 for (int i=0; i

Вывод: 255.

Важно: итеративный метод проще для понимания и безопаснее при r близком к 1 для небольших n, но требует O(n) времени.

Формула (эффективный подход)

Формула для суммы первых n членов геометрического ряда:

S_n = a * (1 - r^n) / (1 - r)

где a — первый член, r — общее соотношение, n — число членов.

Эта формула даёт результат за O(1) времени, но требует осторожности при r ≈ 1 и для очень больших степеней из‑за проблем с переполнением или потери точности с плавающей точкой.

Когда формула применима и когда нет

  • Работает для любого r, r != 1. Для r = 1 сумма равна a * n.
  • Для отрицательного r формула остаётся верной, но члены ряда чередуются по знаку.
  • Для очень больших n и |r| > 1 члены растут экспоненциально — может возникнуть переполнение.
  • Для |r| < 1 при n → ∞ сумма сходится к a / (1 - r).

C++ — формула

// C++ program to find the sum of geometric series  
#include   
using namespace std;  
  
// Function to find the sum of geometric series  
float sumOfGeometricSeries(float firstTerm, float commonRatio, int noOfTerms)  
{  
 return (firstTerm * (1 - pow(commonRatio, noOfTerms))) / (1 - commonRatio);  
}  
  
int main()  
{  
 float firstTerm = 1;  
 float commonRatio = 2;  
 int noOfTerms = 8;  
 cout << "First Term: " << firstTerm << endl;  
 cout << "Common Ratio: " << commonRatio << endl;  
 cout << "Number of Terms: " << noOfTerms << endl;  
 cout << "Sum of the geometric series: " << sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms) << endl;  
  
 return 0;  
}

Python — формула

# Python program to find the sum of geometric series  
  
# Function to find the sum of geometric series  
def sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms):  
    return (firstTerm * (1 - pow(commonRatio, noOfTerms))) / (1 - commonRatio)  
  
firstTerm = 1  
commonRatio = 2  
noOfTerms = 8  
print("First Term:", firstTerm)  
print("Common Ratio:", commonRatio)  
print("Number of Terms:", noOfTerms)  
print("Sum of the geometric series:", sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms))  

JavaScript — формула

// JavaScript program to find the sum of geometric series  
  
// Function to find the sum of geometric series  
function sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms) {  
 return (firstTerm * (1 - Math.pow(commonRatio, noOfTerms))) / (1 - commonRatio);  
}  
  
  
var firstTerm = 1;  
var commonRatio = 2;  
var noOfTerms = 8;  
document.write("First Term: " + firstTerm + "  \n");  
document.write("Common Ratio: " + commonRatio + "  \n");  
document.write("Number of Terms: " + noOfTerms + "  \n");  
document.write("Sum of the geometric series: " + sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms));

C — формула

// C program to find the sum of geometric series  
#include   
#include   
  
// Function to find the sum of geometric series  
float sumOfGeometricSeries(float firstTerm, float commonRatio, int noOfTerms)  
{  
 return (firstTerm * (1 - pow(commonRatio, noOfTerms))) / (1 - commonRatio);  
}  
  
int main()  
{  
 float firstTerm = 1;  
 float commonRatio = 2;  
 int noOfTerms = 8;  
 printf("First Term: %f \n", firstTerm);  
 printf("Common Ratio: %f \n", commonRatio);  
 printf("Number of Terms: %d \n", noOfTerms);  
 printf("Sum of the geometric series: %f \n", sumOfGeometricSeries(firstTerm, commonRatio, noOfTerms));  
  
 return 0;  
}

Практические замечания и рекомендации

  • Если r == 1, возвращайте a * n, чтобы избежать деления на ноль.
  • Если n велико и |r| > 1, члены быстро растут и может случиться переполнение. Рассмотрите использование длинной арифметики (bigint/bigfloat) или проверку пределов до вычислений.
  • Для вычисления r^n используйте встроенные pow с типом с плавающей точкой или целочисленную экспоненциацию по возведению в степень (быстрое возведение в степень) для целых r и больших n.
  • При работе с float/double следите за потерей точности, особенно когда r близко к 1: выражение (1 - r^n) может привести к вычитанию близких по величине чисел. В таких случаях итеративный метод может дать более надёжный результат для небольших n.

Когда формула даёт плохую точность (контрпример)

  • a = 1e8, r = 1.0000001, n = 1000000. Здесь r^n может оказаться огромным, а выражение (1 - r^n) потеряет точность из‑за вычитания близких величин или переполнения.
  • r отрицательно и |r| близко к 1: чередование знака приводит к сильной отмене при суммировании в плавающей арифметике.

В таких случаях используйте специализированные численные приёмы (например, Kahan summation) или работайте в более точных типах.

Мини‑методика для практического выбора метода

  1. Если n небольшой (< 10^6) и простота важна — используйте итеративный метод.
  2. Если n большой и r далеко от 1 — формула быстрее, но проверяйте переполнение.
  3. Если r == 1 — верный ответ a * n.
  4. Если требуется высокая точность для плавающих типов — используйте увеличенную точность (double/long double) и алгоритмы аккумулированной суммы.

Критерии приёмки (тесты)

  1. Базовый тест: a = 1, r = 2, n = 8 -> 255.
  2. r = 1: любое a, n -> a * n.
  3. r = 0: сумма равна a (только первый член ненулевой).
  4. Отрицательное r: a = 1, r = -2, n = 4 -> 1 - 2 + 4 - 8 = -5.
  5. Большие n, |r| < 1: сходится к a / (1 - r) по мере роста n.
  6. Проверка на переполнение: подобрать параметры, при которых pow(r, n) выходит за границы типа, и убедиться, что код корректно обрабатывает ошибку или предупреждает.

Чек-лист для разработчика

  • Обработаны граничные случаи: r == 1, r == 0, n == 0.
  • Используется подходящий тип (int/long/double) для входных данных.
  • Добавлены тесты для отрицательных r и больших n.
  • Документирована ожидаемая сложность (итерация O(n), формула O(1)).
  • При необходимости добавлены проверки на переполнение и потери точности.

Краткое резюме

  • Итеративный метод прост и стабилен для небольших n.
  • Формула даёт O(1)-решение, но требует осторожности при r ≈ 1 и при опасности переполнения/потери точности.
  • Всегда проверяйте граничные случаи (r == 1, r == 0, отрицательный r) и добавляйте тесты.

Если хотите, могу добавить версии с использованием целочисленного быстрого возведения в степень, реализации с аккумулированной суммой (Kahan) или готовые unit-тесты для выбранного языка.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Публикация из Lightroom в Instagram
Фотография

Публикация из Lightroom в Instagram

Serval Mesh — мобильная mesh‑связь при катастрофах
Связь

Serval Mesh — мобильная mesh‑связь при катастрофах

Автоматизация конверсии валют с Fixer
APIs

Автоматизация конверсии валют с Fixer

Аутентификация React + Supabase — быстрое руководство
Frontend

Аутентификация React + Supabase — быстрое руководство

Режим киоска Windows 10: включение и настройка
Windows

Режим киоска Windows 10: включение и настройка

Восстановление файлов: CrypBoss, HydraCrypt, UmbreCrypt
Кибербезопасность

Восстановление файлов: CrypBoss, HydraCrypt, UmbreCrypt