"Покой нам может только сниться". ))
Вот ещё одно решение тестовой задачи с курса углублённого программирования на C:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main()
{
long long int Num = 0;
long double n;
char stringNum [21];
int length = 0;
if(scanf("%s", stringNum)!=1 || strlen(stringNum) > 20) return 0;
length = strlen(stringNum);
for(int i = 1; i < length; ++i)
{
if(stringNum[i] < 48 || stringNum[i] > 57) return 0;
}
Num = atoll(stringNum);
n = (sqrt(1 + 8 * (double)Num) - 1) / 2;
if (Num > 0 && Num <= 9223372036854775807 && ((long long int)n*((long long int)n+1)/2) == Num)
{
printf ("%lli\n", (long long int)n);
}
return 0;
}
В этот раз программа принимает треугольное число как строку символов и после проверок корректности ввода преобразует его в число. Интересно было бы прогнать эту программу через тесты с курсов углублённого программирования на C.
Всё вроде бы хорошо делает программа, вот только при подаче ей на вход количества символов, превышающего размер массива (например: 11111111111111111111111111111111111111) она выдаёт:
*** stack smashing detected ***: ./triang-num terminated
Аварийный останов (сделан дамп памяти)