Проблема в коде. Не могу найти ошибку

Суть кода, решить следующую задачу:

  1. Пользователь вводит целое положительное число k. Найти наибольшее значение суммы 1^n + 4^n + 7^n +10^n + ... + (3k–2)^n, которое не выходит за пределы диапазона типа long int. Определить значение n для найденной суммы. 2) Определить, какая операция является причиной переполнения при попытке вычисления значения суммы для n+1. Если причиной переполнения является суммирование слагаемых, то вывести символ «+» (плюс), если – умножение (при возведении в степень), то вывести символ «*» (звёздочка). (В программе не следует использовать стандартную функцию возведения в степень, массивы и вычисления с плавающей точкой. Целочисленные типы данных с интервалом шире, чем long int, использовать запрещено.)

Для решения задачи был написан следующий код:

#include <stdio.h>
int main() {
long int k;

// Вводим значение k
printf("Введите целое положительное число k: ");
scanf("%ld", &k);

long int max_sum = 0;
long int n = 1;
char operation = '*';  // Изначально предполагаем, что переполнение произойдет из-за умножения

while (1) {
    long int result = 0;
    int sum_overflow = 0;

    // Вычисляем сумму 1^n + 4^n + 7^n + ... + (3k-2)^n
    for (long int i = 1; i <= k; i++) {
        long int term = 1;

        // Проверяем, вызовет ли умножение переполнение
        if (__builtin_smull_overflow(term, (3 * i - 2), &term)) {
            operation = '*';
            break;
        }

        // Проверяем, вызовет ли сложение переполнение
        if (__builtin_saddl_overflow(result, term, &result)) {
            sum_overflow = 1;
            break;
        }
    }

    // Если результат не переполнился, сохраняем его и увеличиваем n
    if (result >= max_sum) {
        max_sum = result;
        n++;

        // Если переполнение было вызвано сложением, то переключаемся на операцию сложения
        if (sum_overflow) {
            operation = '+';
        }
    } else {
        break;
    }
}

printf("Наибольшая сумма: %ld\n", max_sum);
printf("Значение n: %ld\n", n - 1);  // n увеличивается после переполнения

if (operation == '+') {
    printf("Причина переполнения: '+'\n");
} else {
    printf("Причина переполнения: '*'\n");
}

return 0;

}

Код к сожалению не работает, не могу найти ошибку


Ответы (0 шт):