воскресенье, 16 октября 2016 г.

Ещё решение

"Покой нам может только сниться". ))
Вот ещё одно решение тестовой задачи с курса углублённого программирования на 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                                                    
Аварийный останов (сделан дамп памяти)
Интересно, это посчитали бы как несоответствие условиям задачи? Ведь по условиям задачи при некорректном вводе программа должна возвращать 0...

До        После