Ответы Mail.ru: Проверка кода на С++

Проблема в вашем коде связана с точностью представления действительных чисел с плавающей запятой в компьютере. Ваш цикл выполняется до тех пор, пока afterPoint не станет равным целому числу или до тех пор, пока count не достигнет 15. Это ограничение на 15 итераций в цикле вызывает некорректное поведение для чисел, которые имеют конечное, но большое количество знаков после запятой.

Для решения этой проблемы вы можете использовать следующий код:

 #include  
#include  
 
using namespace std; 
 
int main() { 
    // Ввод данных 
    double R; 
    cin >> R; 
 
    // Преобразование числа к абсолютному значению 
    R = fabs(R); 
 
    // Проверка на целое число 
    if (R == floor(R)) { 
        cout << 0 << endl; 
    } else { 
        // Вычисления 
        double afterPoint = R - floor(R); 
        int count = 0; 
        while (afterPoint > 1e-10 && count < 15) { 
            afterPoint *= 10; 
            count++; 
        } 
 
        // Вывод 
        cout << count << endl; 
    } 
 
    return 0; 
} 
 

Этот код сначала преобразует число к абсолютному значению, затем проверяет, является ли оно целым числом. Если число не является целым, то программа вычисляет количество знаков после точки, учитывая погрешности представления чисел с плавающей запятой.