Проблема в коде. Не могу найти ошибку
Суть кода, решить следующую задачу:
- Пользователь вводит целое положительное число 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;
}
Код к сожалению не работает, не могу найти ошибку